]> git.evergreen-ils.org Git - Evergreen.git/blob - Evergreen/staff_client/chrome/content/evergreen/cat/marc.js
changes need to force legacy code work
[Evergreen.git] / Evergreen / staff_client / chrome / content / evergreen / cat / marc.js
1 mw.sdump('D_CAT','loading marc.js\n');
2
3 var character_measure = {};
4 var tree;
5 var meta;
6 var backup_tree;
7
8 function my_init() {
9         mw.sdump('D_CAT','Entering my_init() : ' + timer_elapsed('cat') + '\n');
10         mw.sdump('D_CAT','TESTING: marc.js: ' + mw.G['main_test_variable'] + '\n');
11
12         mw.sdump('D_CAT',"DOC ID " + find_this_id + "\n" );
13
14         if (! params.import_tree ) {
15                 tree = retrieve_record( find_this_id );
16                 meta = retrieve_meta_record( find_this_id );
17                 document.getElementById('meta_create_date').setAttribute('value',
18                         meta.create_date().split('.')[0]        
19                 );
20                 document.getElementById('meta_creator').setAttribute('value',
21                         meta.creator()  
22                 );
23                 document.getElementById('meta_edit_date').setAttribute('value',
24                         meta.edit_date().split('.')[0]
25                 );
26                 document.getElementById('meta_editor').setAttribute('value',
27                         meta.editor()   
28                 );
29                 document.getElementById('meta_tcn_publisher').setAttribute('value',
30                         meta.tcn_value()        
31                 );
32                 if (params.record_columns) {
33                         var text = document.createTextNode(
34                                 params.record_columns[1] + ' / ' + params.record_columns[2]
35                         );
36                         document.getElementById('meta_title_author').appendChild(
37                                 text
38                         );
39                 }
40         } else {
41                 tree = params.import_tree;
42                 if (tree.name() == 'collection') { 
43                         tree = find_list(
44                                 tree.children(),
45                                 function (obj) {
46                                         return (obj.name() == 'record');
47                                 }
48                         ); 
49                 }
50         }
51         //mw.sdump('D_CAT','Retrieved: ' + js2JSON(tree) + '\n');
52         //mw.sdump('D_CAT','Retrieved: ' + js2JSON(meta) + '\n');
53         build_grid( 
54                 document.getElementById('ctrl_rows'), 
55                 document.getElementById('data_rows'), 
56                 tree
57         );
58         fixed_fields_show_only('fixed_grid','BKS');
59         apply_event_listeners('fixed_grid','fixed');
60         character_measure = measure_character('marc_win','M');
61         window.addEventListener('resize',my_resize_handler,false);
62         handle_tag_change();
63         document.getElementById('data_rows').firstChild.firstChild.firstChild.focus();
64         mw.sdump('D_CAT','Exiting my_init() : ' + timer_elapsed('cat') + '\n');
65 }
66
67 function measure_character(w,c) {
68         var el = document.getElementById(w);
69         var b = document.createElement('hbox');
70         var l = document.createElement('label');
71         l.setAttribute('class','marc');
72         el.appendChild(b);
73         b.appendChild(l);
74         var lwidth = l.boxObject.width;
75         l.value = c;
76         lwidth = Math.abs( l.boxObject.width - lwidth);
77         var lheight = l.boxObject.height;
78         b.removeChild(l); el.removeChild(b);
79         return { "width" : lwidth, "height" : lheight };
80 }
81
82 function my_resize_handler(ev) {
83         mw.sdump('D_CAT','resize\n');
84         resizeAllWrappers('ctrl_rows');
85         resizeAllWrappers('data_rows');
86 }
87
88 function retrieve_record(id) {
89         mw.sdump('D_CAT','Entering retrieve_record() : ' + timer_elapsed('cat') + '\n');
90         var result = user_request(
91                 'open-ils.cat',
92                 'open-ils.cat.biblio.record.tree.retrieve',
93                 [ id ]
94         );
95         //var result = [ JSON2js( test_nodeset() ) ];
96         /*var result = user_request(
97                 'open-ils.cat',
98                 'open-ils.cat.biblio.record.tree.retrieve.test',
99                 [ id ]
100         );*/
101         if (typeof(result[0]) != 'object') {
102                 alert( 'user_request gave ' + js2JSON(result) );
103                 mw.sdump('D_CAT','Exiting retrieve_record() : ' + timer_elapsed('cat') + '\n');
104                 return 0;
105         } else {
106                 /*
107                 mw.sdump('D_CAT','Entering nodeset2tree() : ' + timer_elapsed('cat') + '\n');
108                 result[0] = nodeset2tree( result[0] )[0];
109                 mw.sdump('D_CAT','Exiting nodeset2tree() : ' + timer_elapsed('cat') + '\n');
110                 */
111                 mw.sdump('D_CAT','Exiting retrieve_record() : ' + timer_elapsed('cat') + '\n');
112                 return result[0];
113         }
114 }
115
116 function retrieve_meta_record(id) {
117         mw.sdump('D_CAT','Entering retrieve_meta_record() : ' + timer_elapsed('cat') + '\n');
118         var result = user_request(
119                 'open-ils.cat',
120                 'open-ils.cat.biblio.record.metadata.retrieve',
121                 [ id ]
122         );
123         if (typeof(result[0]) != 'object') {
124                 alert( 'user_request gave ' + js2JSON(result) );
125                 mw.sdump('D_CAT','Exiting retrieve_meta_record() : ' + timer_elapsed('cat') + '\n');
126                 return 0;
127         } else {
128                 mw.sdump('D_CAT','Exiting retrieve_meta_record() : ' + timer_elapsed('cat') + '\n');
129                 return result[0][0];
130         }
131 }
132
133
134
135 function empty_me(p) {
136         while (p.lastChild) {
137                 //mw.sdump('D_CAT','emptying ' + p.lastChild.tagName + '\n');
138                 empty_me(p.lastChild);
139                 p.removeChild(p.lastChild);
140         }
141 }
142
143 function empty_grid( ctrl_rows, data_rows ) {
144         var rows = document.getElementById(ctrl_rows);
145         empty_me(rows);
146         rows = document.getElementById(data_rows);
147         empty_me(rows);
148 }
149
150 function build_grid( ctrl_rows, data_rows, root ) {
151         mw.sdump('D_CAT','Entering build_grid() : ' + timer_elapsed('cat') + '\n');
152         var ctrl_count = 1; var data_count = 1;
153         //mw.sdump('D_CAT', 'what is root?\n' + pretty_print(js2JSON(root)) + '\n');
154         mw.sdump('D_CAT','root.children.length = ' + root.children.length + '\n');
155         root_loop: 
156         var children = root.children();
157         for (var i in children) {
158                 var node = children[i];
159                 var node_type = node.node_type();
160                 var row = {};
161                 switch(node_type) {
162                         case '18': /* namespace */ 
163                                 break;
164                         case '1': /* element */
165                                 row = get_row(node);
166                                 switch(row.type) {
167                                         case 'leader': case 'controlfield':
168                                                         populate_xul_row( 
169                                                                 ctrl_rows, 
170                                                                 row, 
171                                                                 'ctrl_' + ctrl_count++
172                                                         );
173                                                 break;
174                                         case 'datafield':
175                                                         populate_xul_row( 
176                                                                 data_rows, 
177                                                                 row, 
178                                                                 'data_' + data_count++
179                                                         );
180                                                 break;
181                                         default:
182                                                 mw.sdump('D_CAT','Unexpected row type: ' + 
183                                                         js2JSON(node) + '\n');
184                                                 break;
185                                 }
186                                 break;
187                         default: /* eh? */
188                                 mw.sdump('D_CAT', 'Did not expect node_type = ' + node_type + 
189                                         ' : ' + js2JSON(node) + '\n');
190                                 break;
191                 }
192                 //mw.sdump('D_CAT', i + ' ' + dump_ns_node(node) + '\n');
193         }
194         mw.sdump('D_CAT','Exiting build_grid() : ' + timer_elapsed('cat') + '\n');
195 }
196
197 function get_row( top ) {
198         var row = { 
199                 'field' : { 'id' : '1' },
200                 'tag' : { 'value' : '', 'id' : '-1' },
201                 'ind1' : { 'value' : '', 'id' : '-1' },
202                 'ind2' : { 'value' : '', 'id' : '-1' },
203                 'data' : { 'value' : '', 'id' : '-1' }
204         };
205         var name = top.name(); 
206         var id = top.intra_doc_id(); 
207         var children = top.children();
208         row.field.id = id;
209         mw.sdump('D_CAT','Making row.... row.field.id = <' + id + '>\n');
210         if (name == 'leader') { row.tag.value = 'LDR'; row.tag.id = id; }
211         row.type = name;
212         top_loop:
213         for (var i in children) {
214                 var node = children[i];
215                 var node_type = node.node_type();
216                 var node_name = node.name();
217                 var node_value = node.value();
218                 var node_id = node.intra_doc_id();
219                 var node_children = node.children();
220                 switch(node_type) {
221                         case '18': /* namespace */ 
222                                 continue top_loop;
223                         case '2': /* attribute */ 
224                                 switch(node_name) {
225                                         case 'tag':
226                                                 row.tag.value = node_value;
227                                                 row.tag.id = node_id;
228                                                 break;
229                                         case 'ind1':
230                                                 row.ind1.value = node_value;
231                                                 row.ind1.id = node_id;
232                                                 break;
233                                         case 'ind2':
234                                                 row.ind2.value = node_value;
235                                                 row.ind2.id = node_id;
236                                                 break;
237                                         default:
238                                                 mw.sdump('D_CAT','\tattribute surprise on node_name = ' +
239                                                         node_name + ' : ' 
240                                                         + js2JSON(node) + '\n');
241                                                 break;
242                                 }
243                                 break;
244                         case '1': /* element */
245                                 switch(node_name) {
246                                         case 'subfield':
247                                                 row.data.value = row.data.value + 
248                                                 String.fromCharCode(8225) +
249                                                 node_children[0].value() + ' ' + 
250                                                 node_children[1].value() + ' ';
251                                                 row.data.id = node_id;
252                                                 break;
253                                         default:
254                                                 mw.sdump('D_CAT','\telement surprise on node_name = ' +
255                                                         node_name + ' : ' 
256                                                         + js2JSON(node) + '\n');
257                                                 break;
258                                 }
259                                 break;
260                         case '3': /* textNode */
261                                 row.data.value = node_value;
262                                 row.data.id = node_id;
263                                 break;
264                         default: /* eh? */
265                                 mw.sdump('D_CAT','\tunknown type surprise on node_type = ' +
266                                         node_type + ' : '  +
267                                         js2JSON(node) + '\n');
268                                 break;
269                 }
270         }
271         //mw.sdump('D_CAT',js2JSON(row) + '\n');
272         return row;
273 }
274
275 function build_xul_row( id, type ) {
276         switch(type) {
277                 case 'leader': case 'controlfield':
278                         return build_ctrl_row( id );
279                         break;
280                 case 'datafield':
281                         return build_data_row( id );
282                         break;
283                 default:
284                         mw.sdump('D_CAT','Unexpected row type\n');
285                         break;
286         }
287 }
288
289 function build_data_row( id ) {
290         //mw.sdump('D_CAT','Entering build_xul_row() : ' + timer_elapsed('cat') + '\n');
291         var xul_row = document.createElement('row');
292         xul_row.setAttribute('id',id);
293         xul_row.setAttribute('class','field_row data_row');
294         //xul_rows.appendChild(xul_row);
295
296         /* the elements in the row */
297         var wrapper1 = document.createElement('hbox');
298         wrapper1.setAttribute( 'class', 'marc_wrapper marc_tag_wrapper');
299         var xul_col1 = document.createElement('textbox');
300                 xul_col1.setAttribute( 'cols', '3');
301                 xul_col1.setAttribute( 'rows', '1');
302                 xul_col1.setAttribute( 'multiline', 'true');
303                 xul_col1.setAttribute( 'size', '3');
304                 xul_col1.setAttribute( 'class', 'marc marc_tag');
305                 wrapper1.appendChild(xul_col1);
306                 xul_row.appendChild(wrapper1);
307         var wrapper2 = document.createElement('hbox');
308         wrapper2.setAttribute( 'class', 'marc_wrapper marc_ind_wrapper marc_ind1_wrapper');
309         var xul_col2 = document.createElement('textbox');
310                 xul_col2.setAttribute( 'cols', '1');
311                 xul_col2.setAttribute( 'rows', '1');
312                 xul_col2.setAttribute( 'multiline', 'true');
313                 xul_col2.setAttribute( 'size', '1');
314                 xul_col2.setAttribute( 'class', 'marc marc_ind marc_ind1');
315                 wrapper2.appendChild(xul_col2);
316                 xul_row.appendChild(wrapper2);
317         var wrapper3 = document.createElement('hbox');
318         wrapper3.setAttribute( 'class', 'marc_wrapper marc_ind_wrapper marc_ind2_wrapper');
319         var xul_col3 = document.createElement('textbox');
320                 xul_col3.setAttribute( 'cols', '1');
321                 xul_col3.setAttribute( 'rows', '1');
322                 xul_col3.setAttribute( 'multiline', 'true');
323                 xul_col3.setAttribute( 'size', '1');
324                 xul_col3.setAttribute( 'class', 'marc marc_ind marc_ind2');
325                 wrapper3.appendChild(xul_col3);
326                 xul_row.appendChild(wrapper3);
327         var wrapper4 = document.createElement('hbox');
328         wrapper4.setAttribute( 'class', 'marc_wrapper marc_data_wrapper');
329         var xul_col4 = document.createElement('textbox');
330                 xul_col4.setAttribute( 'subfields', 'true');
331                 xul_col4.setAttribute( 'cols', '60');
332                 xul_col4.setAttribute( 'size', '60');
333                 xul_col4.setAttribute( 'rows', '1');
334                 xul_col4.setAttribute( 'multiline', 'true');
335                 xul_col4.setAttribute( 'class', 'marc marc_data resizable');
336                 xul_col4.setAttribute( 'flex', '1');
337                 wrapper4.appendChild(xul_col4);
338                 xul_row.appendChild(wrapper4);
339
340         return xul_row;
341         //mw.sdump('D_CAT','Exiting build_xul_row() : ' + timer_elapsed('cat') + '\n');
342 }
343
344 function build_ctrl_row( id ) {
345         //mw.sdump('D_CAT','Entering build_xul_row() : ' + timer_elapsed('cat') + '\n');
346         var xul_row = document.createElement('row');
347         xul_row.setAttribute('class','field_row ctrl_row');
348         xul_row.setAttribute('id',id);
349         //xul_rows.appendChild(xul_row);
350
351         /* the elements in the row */
352         var wrapper1 = document.createElement('hbox');
353         wrapper1.setAttribute( 'class', 'marc_wrapper marc_tag_wrapper ctrl_wrapper');
354         var xul_col1 = document.createElement('textbox');
355                 xul_col1.setAttribute( 'cols', '3');
356                 xul_col1.setAttribute( 'rows', '1');
357                 xul_col1.setAttribute( 'multiline', 'true');
358                 xul_col1.setAttribute( 'size', '3');
359                 xul_col1.setAttribute( 'class', 'marc marc_tag ctrl');
360                 xul_col1.setAttribute( 'disabled', 'true');
361                 wrapper1.appendChild(xul_col1);
362                 xul_row.appendChild(wrapper1);
363         var wrapper4 = document.createElement('hbox');
364         wrapper4.setAttribute( 'class', 'marc_wrapper marc_data_wrapper ctrl_wrapper');
365         var xul_col4 = document.createElement('textbox');
366                 xul_col4.setAttribute( 'cols', '60');
367                 xul_col4.setAttribute( 'size', '60');
368                 xul_col4.setAttribute( 'rows', '1');
369                 xul_col4.setAttribute( 'multiline', 'true');
370                 xul_col4.setAttribute( 'class', 'marc marc_data ctrl');
371                 xul_col4.setAttribute( 'flex', '1');
372                 xul_col4.setAttribute( 'disabled', 'true');
373                 wrapper4.appendChild(xul_col4);
374                 xul_row.appendChild(wrapper4);
375
376         return xul_row;
377         //mw.sdump('D_CAT','Exiting build_xul_row() : ' + timer_elapsed('cat') + '\n');
378 }
379
380
381 function apply_event_listeners(c,which) {
382         switch(which) {
383                 case 'ctrl':
384                         break;
385                 case 'data':
386                         c[0].firstChild.addEventListener("change",handle_tag_change,false);
387                         c[0].firstChild.addEventListener("keypress",handle_keypress,false);
388                         c[1].firstChild.addEventListener("keypress",handle_keypress,false);
389                         c[1].firstChild.addEventListener("change",handle_tag_change,false);
390                         c[2].firstChild.addEventListener("keypress",handle_keypress,false);
391                         c[2].firstChild.addEventListener("change",handle_tag_change,false);
392                         c[3].firstChild.addEventListener("keypress",handle_keypress,false);
393                         c[3].firstChild.addEventListener("change",handle_tag_change,false);
394                         c[3].firstChild.addEventListener("change",handle_change,false);
395                         break;
396                 case 'fixed':
397                         var g = document.getElementById(c);
398                         var nl = g.getElementsByTagName('textbox');
399                         for (var i in nl) {
400                                 if (typeof(nl[i])=='object') {
401                                         nl[i].addEventListener("change",handle_fixed_change,false);
402                                 }
403                         }
404                         break;
405         }
406 }
407
408 function populate_xul_row( xul_rows, row, id ) {
409
410         var r = document.getElementById(id);
411         if (!r) {
412                 r = build_xul_row(id,row.type);
413                 xul_rows.appendChild(r);
414                 //r = document.getElementById(id);
415         }
416         r.setAttribute('notempty','true');
417         r.setAttribute('mynode',row.field.id);
418         var c = r.childNodes;
419         switch(row.type) {
420                 case 'leader': case 'controlfield':
421                         c[0].firstChild.value = row.tag.value;
422                         c[0].firstChild.select();
423                         c[0].firstChild.setAttribute('mynode', row.tag.id);
424                         c[1].firstChild.value = row.data.value;
425                         c[1].firstChild.select();
426                         c[1].firstChild.setAttribute('mynode', row.data.id);
427                         apply_event_listeners(c,'ctrl');
428                         break;
429                 case 'datafield':
430                         c[0].firstChild.value = row.tag.value;
431                         c[0].firstChild.select();
432                         c[0].firstChild.setAttribute('mynode', row.tag.id);
433                         c[1].firstChild.value = row.ind1.value;
434                         c[1].firstChild.select();
435                         c[1].firstChild.setAttribute('mynode', row.ind1.id);
436                         c[2].firstChild.value = row.ind2.value;
437                         c[2].firstChild.select();
438                         c[2].firstChild.setAttribute('mynode', row.ind2.id);
439                         c[3].firstChild.value = row.data.value;
440                         c[3].firstChild.select();
441                         c[3].firstChild.setAttribute('mynode', row.data.id);
442                         apply_event_listeners(c,'data');
443                         break;
444         }
445         //resizeWrapper(c3);
446 }
447
448 function handle_change(ev) {
449         mw.sdump('D_CAT','handle_change\n');
450         var t = ev.target;
451         // parse subfields
452         resizeWrapper(t);
453 }
454
455 function resizeWrapper(t) {
456         if (t.tagName != 'textbox') { return; }
457         var wrapper = t.parentNode;
458         var width = wrapper.boxObject.width;
459         var height = wrapper.boxObject.height;
460
461         /*var lwidth = character_measure.width * t.value.length; // linux */
462         var lwidth = (character_measure.width*2+5) * t.value.length; // windows
463         var lheight = character_measure.height;
464
465         if (width == 0) { width = lwidth; }
466         var xrows = Math.ceil( lwidth / width );
467         if (xrows < 1) { xrows = 1; }
468         var xheight = (xrows * (lheight+5)); 
469
470         //mw.sdump('D_CAT',wrapper.parentNode.id + ' wrapper: ' + width + 'x' + height + ' label: ' + lwidth + 'x' + lheight + '\n');
471         wrapper.setAttribute('style','min-height: ' + xheight + 'px;');
472 }
473
474 function resizeAllWrappers(rows) {
475         mw.sdump('D_CAT','Entering resizeAllWrappers() : ' + timer_elapsed('cat') + '\n');
476         var p = document.getElementById(rows);
477         var c = p.childNodes;
478         for (var r in c) {
479                 if (typeof(c[r])=='object') {
480                         if (c[r].getAttribute('notempty')) {
481                                 resizeWrapper(c[r].lastChild.firstChild);
482                         } else {
483                                 p.removeChild(c[r]);
484                         }
485                 }
486         }
487         mw.sdump('D_CAT','Exiting resizeAllWrappers() : ' + timer_elapsed('cat') + '\n');
488 }
489
490 function find_element_with_id(ns_slice,id) {
491         // we might change this in the future to be a hash lookup
492         // { node id => [lvl 1 index, lvl 2 index, lvl 3 index]  }
493         // with the hash being populated when the tree is generated
494         // and updated when we go to insert nodes
495         //mw.sdump('D_CAT','Find ' + id + ' in ' + js2JSON(ns_slice) + '\n');
496         //mw.sdump('D_CAT','Find ' + id + '\n');
497         for (i in ns_slice) {
498                 if (ns_slice[i].intra_doc_id() == id) {
499                         //mw.sdump('D_CAT','Found at index ' + i + '\n');
500                         return i;
501                 }
502         }
503         mw.sdump('D_CAT',id + 'not found in' + js2JSON(ns_slice) + '\n');
504 }
505
506 function delete_children(branch) {
507         var children = branch.children();
508         for (var c in children) {
509                 children[c].isdeleted(1);
510                 mw.sdump('D_CAT', children[c].name() + ':' +
511                         children[c].id() + ':' +
512                         children[c].intra_doc_id() + '.is_deleted = 1\n');
513                 if (children[c].children()) {
514                         delete_children(children[c]);
515                 }
516         }
517 }
518
519 function submit_marc() {
520         // walk through the marc grid and compare with the tree
521         // 1) updates and deletes
522
523 mw.sdump('D_CAT','Updates and Deletes\n');
524         backup_tree = JSON2js( js2JSON( tree ) );
525
526         var tree_fields = tree.children(); // LEVEL 1
527         var ctrl_rows = document.getElementById('ctrl_rows').childNodes;
528         for (var r = 0; r < ctrl_rows.length ; r++) {
529                 //if (r == 0) { continue; } // skip leader for now
530                 //mw.sdump('D_CAT', r + '\n');
531                 var tag_node_id;
532                 try {
533                         tag_node_id = ctrl_rows[r].getAttribute('mynode');
534                 } catch(E) {
535                         mw.sdump('D_CAT','Could not find mynode in ctrl_rows[' + r + ']\n');
536                         continue;
537                 }
538                 //mw.sdump('D_CAT', r + ':' + ctrl_rows[r].tagName + ':' + tag_node_id + '\n' );
539                 if (tag_node_id) {
540 mw.sdump('D_CAT','Processing ctrl_rows[' + r + '], tag_node_id = ' + tag_node_id + '\n');
541                         if (tag_node_id < 0) { continue; } // new node, handle elsewhere
542 mw.sdump('D_CAT','1st find =========================================\n')
543                         var tree_pos = find_element_with_id(tree_fields,tag_node_id);
544                         if (tree_pos == null) { alert('tree_pos problem!'); }
545                         var tree_field = tree_fields[tree_pos];
546
547                         if (ctrl_rows[r].getAttribute('hidden') == 'true') {
548                                 tree_field.isdeleted(1);
549                                 mw.sdump('D_CAT', tree_field.name() + ':' +
550                                         tree_field.id() + ':' +
551                                         tree_field.intra_doc_id() + '.isdeleted = 1\n');
552                                 delete_children(tree_field);
553                                 continue;
554                         }
555
556                         var col1 = ctrl_rows[r].childNodes[0].firstChild;
557                         var col2 = ctrl_rows[r].childNodes[1].firstChild;
558                         var id1 = col1.getAttribute('mynode');
559                         var id2 = col2.getAttribute('mynode');
560                         mw.sdump('D_CAT','id1 = ' + id1 + ' col1.value = ' + col1.value + '  id2 = ' + id2 + ' col2.value = ' + col2.value + '\n');
561                         var tree_field_children = tree_field.children(); // LEVEL 2
562
563                         if (r == 0) { // leader is special.  Only one child
564                                 if (tree_field_children[0].value() != col2.value) {
565                                         tree_field_children[0].value(col2.value);
566                                         tree_field_children[0].ischanged(1);
567                                         mw.sdump('D_CAT', tree_field_children[0].name() + ':' +
568                                                 tree_field_children[0].id() + ':' +
569                                                 tree_field_children[0].intra_doc_id() +
570                                                 '.ischanged = 1\n');
571                                 }
572                                 continue;
573                         }
574
575 mw.sdump('D_CAT','2nd find =========================================\n')
576                         var tree_tag = find_element_with_id(tree_field_children,id1);
577 mw.sdump('D_CAT','3rd find =========================================\n')
578                         var tree_value = find_element_with_id(tree_field_children,id2);
579                         if (tree_tag == null) { alert('tree_tag problem!'); }
580                         if (tree_value == null) { alert('tree_value problem!'); }
581                         if (tree_field_children[tree_tag].value() != col1.value) {
582                                 tree_field_children[tree_tag].value(col1.value);
583                                 tree_field_children[tree_tag].ischanged(1);
584                                 mw.sdump('D_CAT', tree_field_children[tree_tag].name() + ':' +
585                                         tree_field_children[tree_tag].id() + ':' +
586                                         tree_field_children[tree_tag].intra_doc_id() +
587                                         '.ischanged = 1\n');
588                         }
589                         if (tree_field_children[tree_value].value() != col2.value) {
590                                 tree_field_children[tree_value].value(col2.value);
591                                 tree_field_children[tree_value].ischanged(1);
592                                 mw.sdump('D_CAT', tree_field_children[tree_value].name() + ':' +
593                                         tree_field_children[tree_value].id() + ':' +
594                                         tree_field_children[tree_value].intra_doc_id() +
595                                         '.ischanged = 1\n');
596                         }
597                 }
598         }
599         var data_rows = document.getElementById('data_rows').childNodes;
600         for (var r = 0; r < data_rows.length ; r++ ) {
601                 var tag_node_id;
602                 try {
603                         tag_node_id = data_rows[r].getAttribute('mynode');
604                 } catch(E) {
605                         continue;
606                 }
607                 //mw.sdump('D_CAT', r + ':' + data_rows[r].tagName + ':' + tag_node_id + '\n' );
608                 if (tag_node_id) {
609 mw.sdump('D_CAT','Processing data_rows[' + r + '], tag_node_id = ' + tag_node_id + '\n');
610                         if (tag_node_id < 0) { continue; } // new node, handle elsewhere
611 mw.sdump('D_CAT','4th find =========================================\n')
612                         var tree_pos = find_element_with_id(tree_fields,tag_node_id);
613                         if (tree_pos == null) { alert('tree_pos problem!'); }
614                         var tree_field = tree_fields[tree_pos];
615
616                         if (data_rows[r].getAttribute('hidden') == 'true') {
617                                 tree_field.isdeleted(1);
618                                 mw.sdump('D_CAT',tree_field.name() + ':' +
619                                         tree_field.id() + ':' +
620                                         tree_field.intra_doc_id() +
621                                         '.isdeleted = 1\n');
622                                 delete_children(tree_field);
623                                 continue;
624                         }
625
626                         var col1 = data_rows[r].childNodes[0].firstChild;
627                         var col2 = data_rows[r].childNodes[1].firstChild;
628                         var col3 = data_rows[r].childNodes[2].firstChild;
629                         var col4 = data_rows[r].childNodes[3].firstChild;
630                         var id1 = col1.getAttribute('mynode');
631                         var id2 = col2.getAttribute('mynode');
632                         var id3 = col3.getAttribute('mynode');
633                         var id4 = col4.getAttribute('mynode');
634                         var tree_field_children = tree_field.children(); // LEVEL 2
635 mw.sdump('D_CAT','5th find =========================================\n')
636                         var tree_tag = find_element_with_id(tree_field_children,id1);
637 mw.sdump('D_CAT','6th find =========================================\n')
638                         var tree_ind1 = find_element_with_id(tree_field_children,id2);
639 mw.sdump('D_CAT','7th find =========================================\n')
640                         var tree_ind2 = find_element_with_id(tree_field_children,id3);
641 mw.sdump('D_CAT','8th find =========================================\n')
642                         var tree_data = find_element_with_id(tree_field_children,id4);
643                         if (tree_tag == null) { alert('tree_tag problem!'); }
644                         if (tree_ind1 == null) { alert('tree_ind1 problem!'); }
645                         if (tree_ind2 == null) { alert('tree_ind2 problem!'); }
646                         if (tree_data == null) { alert('tree_data problem!'); }
647                         if (tree_field_children[tree_tag].value() != col1.value) {
648                                 tree_field_children[tree_tag].value(col1.value);
649                                 tree_field_children[tree_tag].ischanged(1);
650                                 mw.sdump('D_CAT', tree_field_children[tree_tag].name() + ':' +
651                                         tree_field_children[tree_tag].id() + ':' +
652                                         tree_field_children[tree_tag].intra_doc_id() +
653                                         '.is_changed = 1\n');
654                         }
655                         if (tree_field_children[tree_ind1].value() != col2.value) {
656                                 tree_field_children[tree_ind1].value(col2.value);
657                                 tree_field_children[tree_ind1].ischanged(1);
658                                 mw.sdump('D_CAT', tree_field_children[tree_ind1].name() + ':' +
659                                         tree_field_children[tree_ind1].id() + ':' +
660                                         tree_field_children[tree_ind1].intra_doc_id() +
661                                         '.is_changed = 1\n');
662                         }
663                         if (tree_field_children[tree_ind2].value() != col3.value) {
664                                 tree_field_children[tree_ind2].value(col3.value);
665                                 tree_field_children[tree_ind2].ischanged(1);
666                                 mw.sdump('D_CAT', tree_field_children[tree_ind2].name() + ':' +
667                                         tree_field_children[tree_ind2].id() + ':' +
668                                         tree_field_children[tree_ind2].intra_doc_id() +
669                                         '.is_changed = 1\n');
670                         }
671                         process_subfields(tree_field_children,col4.value); // LEVEL 3
672                 }
673         }
674
675
676         // 2) inserts
677 mw.sdump('D_CAT','Inserts\n');
678
679         for (var r = 0; r < ctrl_rows.length ; r++) {
680                 var newnode;
681                 try {
682                         newnode = ctrl_rows[r].getAttribute('newnode');
683                 } catch(E) {
684                         continue;
685                 }
686                 if (newnode=='true') {
687 mw.sdump('D_CAT','New node = ctrl_rows[' + r + ']');
688                         if (ctrl_rows[r].getAttribute('hidden')=='true') { continue; }
689                         var col1 = ctrl_rows[r].childNodes[0].firstChild.value;
690                         var col2 = ctrl_rows[r].childNodes[1].firstChild.value;
691                         var level1 = new brn(); 
692                                 populate_node( level1, 1, 'controlfield' );
693                         var level2a = new brn(); 
694                                 populate_node( level2a, 2, 'tag' );
695                                 level2a.value(col1);
696                         var level2b = new brn();
697                                 populate_node( level2b, 3, null );
698                                 level2b.value(col2);
699                         level1.children([ level2a, level2b ]);
700                         ctrl_rows[r].setAttribute('mynode', level1.intra_doc_id());
701 mw.sdump('D_CAT',' with intra_doc_id = ' + level1.intra_doc_id() + '\n');
702                         insert_into_tree(tree.children(),ctrl_rows[r],level1);
703                 }
704         }
705
706         for (var r = 0; r < data_rows.length ; r++) {
707                 var newnode;
708                 try {
709                         newnode = data_rows[r].getAttribute('newnode');
710                 } catch(E) {
711                         continue;
712                 }
713                 if (newnode=='true') {
714 mw.sdump('D_CAT','New node = data_rows[' + r + ']');
715                         if (data_rows[r].getAttribute('hidden')=='true') { continue; }
716                         var col1 = data_rows[r].childNodes[0].firstChild.value;
717                         var col2 = data_rows[r].childNodes[1].firstChild.value;
718                         var col3 = data_rows[r].childNodes[2].firstChild.value;
719                         var col4 = data_rows[r].childNodes[3].firstChild.value;
720                         var level1 = new brn(); 
721                                 populate_node( level1, 1, 'datafield' );
722                         var level2a = new brn(); 
723                                 populate_node( level2a, 2, 'tag' );
724                                 level2a.value(col1);
725                         var level2b = new brn();
726                                 populate_node( level2b, 2, 'ind1' );
727                                 level2b.value(col2);
728                         var level2c = new brn();
729                                 populate_node( level2c, 2, 'ind2' );
730                                 level2c.value(col3);
731                         level1.children([ level2a, level2b, level2c ]);
732                         process_subfields(level1.children(),col4);
733                         data_rows[r].setAttribute('mynode', level1.intra_doc_id());
734 mw.sdump('D_CAT',' with intra_doc_id = ' + level1.intra_doc_id() + '\n');
735                         insert_into_tree(tree.children(),data_rows[r],level1);
736                 }
737
738         }
739         //mw.sdump('D_CAT','******\nSending: ' + pretty_print(js2JSON(tree)) + '\n');
740         mw.sdump('D_CAT','Auth session: ' + mw.G['auth_ses'][0] + '\n');
741         try {
742                 if (params.import_tree) {
743                         tree = user_request(
744                                         'open-ils.cat',
745                                         'open-ils.cat.biblio.record.tree.import',
746                                         [ mw.G['auth_ses'][0], tree ]
747                         )[0];
748         
749                 } else {
750                         tree = user_request(
751                                         'open-ils.cat',
752                                         'open-ils.cat.biblio.record.tree.commit',
753                                         [ mw.G['auth_ses'][0], tree ]
754                         )[0];
755                 }
756                 if (typeof(tree) == 'object') {
757                         mw.sdump('D_CAT','\n\n\n\nnew tree = ' + js2JSON(tree) + '\n');
758                         params.import_tree = false;
759                         new_node_id = -1;
760                         empty_grid('ctrl_rows','data_rows');
761                         build_grid( 
762                                 document.getElementById('ctrl_rows'), 
763                                 document.getElementById('data_rows'), 
764                                 tree
765                         );
766                         handle_tag_change();
767                         my_resize_handler();
768                         alert('MARC record successfully updated.');
769                 } else {
770                         throw('result: ' + tree + '\n');
771                 }
772         } catch(E) {
773                 mw.sdump('D_CAT','backup_tree\n');
774                 tree = backup_tree;
775                 handle_tag_change();
776                 my_resize_handler();
777                 handle_error(E);
778         }
779 }
780
781 function insert_into_tree(branch,r,n) {
782         var s = nextSibling_not_hidden(r);
783         if (s) {
784                 mw.sdump('D_CAT','9th find =========================================\n')
785                 mw.sdump('D_CAT','s = ' + s + '\n');
786                 mw.sdump('D_CAT','s.getAttribute mynode = <' + s.getAttribute('mynode') + '>\n');
787                 var pos = find_element_with_id(branch,s.getAttribute('mynode'));
788                 branch.splice(pos,0,n);
789         } else {
790                 branch.push(n);
791         }
792 }
793
794 var new_node_id = -1;
795 function populate_node(node,ntype,name) {
796         node.intra_doc_id( new_node_id-- );
797         node.isnew( 1 );
798         node.node_type( ntype );
799         node.name( name );
800         mw.sdump('D_CAT', node.name() + ':' + node.intra_doc_id() + '.is_new = 1\n');
801 }
802
803 function process_subfields(tfc,datastring) {
804         mw.sdump('D_CAT','process_subfields: <' + tfc + '> <' + datastring + '>\n');
805         var orig_subfields = [];
806         //mw.sdump('D_CAT','\n');
807         for (var i in tfc) {
808                 mw.sdump('D_CAT',i + ' : ' + typeof(tfc[i]) + ' : ' + js2JSON(tfc[i]) + ' : node_type() = ' + tfc[i].node_type() + '\n');
809                 try {
810                         if (tfc[i].node_type() == 1) {
811                                 var orig_data = tfc[i].children()[1].value();
812                                 orig_data = orig_data.replace(/^\s+/,'').replace(/\s+$/,'');
813                                 orig_subfields.push( [ 
814                                         i, // subfield node index
815                                         tfc[i].children()[0].value(), // subf indicator
816                                         orig_data // data
817                                 ] );
818                         }
819
820                 } catch(E) {
821                         mw.sdump('D_CAT','\tan error? gasp: ' + js2JSON(E) + '\n');
822                         continue;
823                 }
824         }
825         datastring = datastring.replace(/^\s+/,'').replace(/\s+$/,'');
826         var local_subf_array = datastring.split(String.fromCharCode(8225));
827         // Our validation routines should assert that the beginning of
828         // a data string start with the subfield delimiter symbol.  We're
829         // passing the buck of the 'implicit' subfield-a check elsewhere.
830         local_subf_array.shift();
831         mw.sdump('D_CAT','orig_subfields = ' + js2JSON(orig_subfields) + '\n');
832         mw.sdump('D_CAT','local_subfields = ' + js2JSON(local_subf_array) + '\n');
833         for (var i in local_subf_array) {
834                 if ((local_subf_array[i]=='')||(local_subf_array==null)) { continue; }
835                 var s_ind = local_subf_array[i].substr(0,1);
836                 var s_data = local_subf_array[i].substr(1).replace(/^\s+/,'').replace(/\s+$/,'');
837                 mw.sdump('D_CAT','Processing code = ' + s_ind + ' and value = ' + s_data + '\n');
838                 if (!orig_subfields[i]) { // new subfield
839                         mw.sdump('D_CAT','making new subfield : i = ' + i + '\n');
840                         var level1 = new brn(); 
841                                 populate_node( level1, 1, 'subfield' );
842                         var level2a = new brn(); 
843                                 populate_node( level2a, 2, 'code' );
844                                 level2a.value(s_ind);
845                         var level2b = new brn();
846                                 populate_node( level2b, 3, null );
847                                 level2b.value(s_data);
848                         level1.children([ level2a, level2b ]);
849                         tfc.push(level1);
850                         mw.sdump('D_CAT','New node = ' + js2JSON(level1) + '\n');
851                 } else {
852                         var orig_node = orig_subfields[i][0];
853                         var orig_ind = orig_subfields[i][1];
854                         var orig_data = orig_subfields[i][2];
855                         if (orig_ind != s_ind) { // update subf indicator
856                                 tfc[orig_node].children()[0].value(s_ind);
857                                 tfc[orig_node].children()[0].ischanged(1);
858                                 mw.sdump('D_CAT', tfc[orig_node].children()[0].name() + ':' +
859                                         tfc[orig_node].children()[0].id() + ':' +
860                                         tfc[orig_node].children()[0].intra_doc_id() +
861                                         '.is_changed = 1\n');
862                         mw.sdump('D_CAT','Updated node = ' + js2JSON(tfc[orig_node].children()[0]) + '\n');
863                         }
864                         if (orig_data != s_data) { // update subf data
865                                 tfc[orig_node].children()[1].value(s_data);
866                                 tfc[orig_node].children()[1].ischanged(1);
867                                 mw.sdump('D_CAT', tfc[orig_node].children()[1].name() + ':' +
868                                         tfc[orig_node].children()[1].id() + ':' +
869                                         tfc[orig_node].children()[1].intra_doc_id() +
870                                         '.is_changed = 1\n');
871                         mw.sdump('D_CAT','Updated node = ' + js2JSON(tfc[orig_node].children()[1]) + '\n');
872                         }
873                 }
874         }
875         // delete any remaining
876         for (var i = local_subf_array.length; i < orig_subfields.length; i++) {
877                 var orig_node = orig_subfields[i][0];
878                 tfc[orig_node].isdeleted(1);
879                 mw.sdump('D_CAT', tfc[orig_node].name() + ':' +
880                         tfc[orig_node].id() + ':' +
881                         tfc[orig_node].intra_doc_id() + '.is_deleted = 1\n');
882                 delete_children(tfc[orig_node]);
883         }
884 }
885
886
887
888 function test_nodeset() {
889         return null;
890 }