]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/cat/marcedit.js
fix
[working/Evergreen.git] / Open-ILS / xul / staff_client / server / cat / marcedit.js
1 var xmlDeclaration = /^<\?xml version[^>]+?>/;
2
3 var serializer = new XMLSerializer();
4 var marcns = new Namespace("http://www.loc.gov/MARC21/slim");
5 var gw = new Namespace("http://opensrf.org/-/namespaces/gateway/v1");
6 var xulns = new Namespace("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
7 default xml namespace = marcns;
8
9 var tooltip_hash = {};
10 var current_focus;
11 var _record_type;
12 var bib_data;
13
14 var xml_record;
15
16 function my_init() {
17         try {
18                 // Fake xulG for standalone...
19                 try {
20                         window.xulG.record;
21                 } catch (e) {
22                         window.xulG = {};
23                         window.xulG.record = {};
24                         window.xulG.save = {};
25
26                         window.xulG.save.label = 'Save Record';
27                         window.xulG.save.func = function (r) { alert(r); }
28
29                         var cgi = new CGI();
30                         var _rid = cgi.param('record');
31                         if (_rid) {
32                                 window.xulG.record.url = '/opac/extras/supercat/retrieve/marcxml/record/' + _rid;
33                         }
34                 }
35                 // End faking part...
36
37                 document.getElementById('save-button').setAttribute('label', window.xulG.save.label);
38                 document.getElementById('save-button').setAttribute('oncommand', 'window.xulG.save.func(xml_record.toXMLString())');
39
40                 if (window.xulG.record.url) {
41                         var req =  new XMLHttpRequest();
42                         req.open('GET',window.xulG.record.url,false);
43                         req.send(null);
44                         window.xulG.record.marc = req.responseText.replace(xmlDeclaration, '');
45                 }
46
47                 xml_record = new XML( window.xulG.record.marc );
48                 if (xml_record..record[0]) xml_record = xml_record..record[0];
49
50                 // Get the tooltip xml all async like
51                 req =  new XMLHttpRequest();
52                 req.open('GET','marcedit-tooltips.xml',true);
53                 req.onreadystatechange = function () {
54                         if (req.readyState == 4) {
55                                 bib_data = new XML( req.responseText.replace(xmlDeclaration, '') );
56                                 genToolTips();
57                         }
58                 }
59                 req.send(null);
60
61                 loadRecord(xml_record);
62         } catch(E) {
63                 alert('FIXME, MARC Editor, my_init: ' + E);
64         }
65 }
66
67
68 function createComplexHTMLElement (e, attrs, objects, text) {
69         var l = document.createElementNS('http://www.w3.org/1999/xhtml',e);
70
71         if (attrs) {
72                 for (var i in attrs) l.setAttribute(i,attrs[i]);
73         }
74
75         if (objects) {
76                 for ( var i in objects ) l.appendChild( objects[i] );
77         }
78
79         if (text) {
80                 l.appendChild( document.createTextNode(text) )
81         }
82
83         return l;
84 }
85
86 function createComplexXULElement (e, attrs, objects) {
87         var l = document.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul',e);
88
89         if (attrs) {
90                 for (var i in attrs) {
91                         if (typeof attrs[i] == 'function') {
92                                 l.addEventListener( i, attrs[i], true );
93                         } else {
94                                 l.setAttribute(i,attrs[i]);
95                         }
96                 }
97         } 
98
99         if (objects) {
100                 for ( var i in objects ) l.appendChild( objects[i] );
101         }
102
103         return l;
104 }
105
106 function createDescription (attrs) {
107         return createComplexXULElement('description', attrs, Array.prototype.slice.apply(arguments, [1]) );
108 }
109
110 function createTooltip (attrs) {
111         return createComplexXULElement('tooltip', attrs, Array.prototype.slice.apply(arguments, [1]) );
112 }
113
114 function createLabel (attrs) {
115         return createComplexXULElement('label', attrs, Array.prototype.slice.apply(arguments, [1]) );
116 }
117
118 function createVbox (attrs) {
119         return createComplexXULElement('vbox', attrs, Array.prototype.slice.apply(arguments, [1]) );
120 }
121
122 function createHbox (attrs) {
123         return createComplexXULElement('hbox', attrs, Array.prototype.slice.apply(arguments, [1]) );
124 }
125
126 function createRow (attrs) {
127         return createComplexXULElement('row', attrs, Array.prototype.slice.apply(arguments, [1]) );
128 }
129
130 function createTextbox (attrs) {
131         return createComplexXULElement('textbox', attrs, Array.prototype.slice.apply(arguments, [1]) );
132 }
133
134 function createMenu (attrs) {
135         return createComplexXULElement('menu', attrs, Array.prototype.slice.apply(arguments, [1]) );
136 }
137
138 function createMenuPopup (attrs) {
139         return createComplexXULElement('menupopup', attrs, Array.prototype.slice.apply(arguments, [1]) );
140 }
141
142 function createPopup (attrs) {
143         return createComplexXULElement('popup', attrs, Array.prototype.slice.apply(arguments, [1]) );
144 }
145
146 function createMenuitem (attrs) {
147         return createComplexXULElement('menuitem', attrs, Array.prototype.slice.apply(arguments, [1]) );
148 }
149
150 function createCheckbox (attrs) {
151         return createComplexXULElement('checkbox', attrs, Array.prototype.slice.apply(arguments, [1]) );
152 }
153
154 function createMARCTextbox (element,attrs) {
155
156         var box = createComplexXULElement('textbox', attrs, Array.prototype.slice.apply(arguments, [2]) );
157         box.onkeypress = function (event) {
158                 var root_node;
159                 var node = element;
160                 while(node = node.parent()) {
161                         root_node = node;
162                 }
163
164                 var row = event.target;
165                 while (row.tagName != 'row') row = row.parentNode;
166
167                 if (element.nodeKind() == 'attribute') element[0]=box.value;
168                 else element.setChildren( box.value );
169
170                 if (event.charCode == 100 && event.ctrlKey) { // ctrl+d
171
172                         var index_sf, target, move_data;
173                         if (element.localName() == 'subfield') {
174                                 index_sf = element;
175                                 target = event.target.parentNode;
176
177                                 var start = event.target.selectionStart;
178                                 var end = event.target.selectionEnd - event.target.selectionStart ?
179                                                 event.target.selectionEnd :
180                                                 event.target.value.length;
181
182                                 move_data = event.target.value.substring(start,end);
183                                 event.target.value = event.target.value.substring(0,start) + event.target.value.substring(end);
184                                 event.target.setAttribute('size', event.target.value.length + 2);
185
186                                 element.setChildren( event.target.value );
187
188                         } else if (element.localName() == 'code') {
189                                 index_sf = element.parent();
190                                 target = event.target.parentNode;
191                         } else if (element.localName() == 'tag' || element.localName() == 'ind1' || element.localName() == 'ind2') {
192                                 index_sf = element.parent().children()[element.parent().children().length() - 1];
193                                 target = event.target.parentNode.lastChild.lastChild;
194                         }
195
196                         var sf = <subfield code="" xmlns="http://www.loc.gov/MARC21/slim">{ move_data }</subfield>;
197
198                         index_sf.parent().insertChildAfter( index_sf, sf );
199
200                         var new_sf = marcSubfield(sf);
201
202                         if (target === target.parentNode.lastChild) {
203                                 target.parentNode.appendChild( new_sf );
204                         } else {
205                                 target.parentNode.insertBefore( new_sf, target.nextSibling );
206                         }
207
208                         new_sf.firstChild.nextSibling.focus();
209
210                         event.preventDefault();
211                         return false;
212
213                 } else if (event.keyCode == 13 || event.keyCode == 77) {
214                         if (event.ctrlKey) { // ctrl+enter
215
216                                 var index;
217                                 if (element.localName() == 'subfield') index = element.parent();
218                                 if (element.localName() == 'code') index = element.parent().parent();
219                                 if (element.localName() == 'tag') index = element.parent();
220                                 if (element.localName() == 'ind1') index = element.parent();
221                                 if (element.localName() == 'ind2') index = element.parent();
222
223                                 var df = <datafield tag="" ind1="" ind2="" xmlns="http://www.loc.gov/MARC21/slim"><subfield code="" /></datafield>;
224
225                                 index.parent().insertChildAfter( index, df );
226
227                                 var new_df = marcDatafield(df);
228
229                                 if (row.parentNode.lastChild === row) {
230                                         row.parentNode.appendChild( new_df );
231                                 } else {
232                                         row.parentNode.insertBefore( new_df, row.nextSibling );
233                                 }
234
235                                 new_df.firstChild.focus();
236
237                                 event.preventDefault();
238                                 return false;
239
240                         } else if (event.shiftKey) {
241                                 if (row.previousSibling.className.match('marcDatafieldRow'))
242                                         row.previousSibling.firstChild.focus();
243                         } else {
244                                 row.nextSibling.firstChild.focus();
245                         }
246
247                 } else if (event.keyCode == 46 && event.ctrlKey) { // ctrl+del
248
249                         var index;
250                         if (element.localName() == 'subfield') index = element.parent();
251                         if (element.localName() == 'code') index = element.parent().parent();
252                         if (element.localName() == 'tag') index = element.parent();
253                         if (element.localName() == 'ind1') index = element.parent();
254                         if (element.localName() == 'ind2') index = element.parent();
255
256                         for (var i in index.parent().children()) {
257                                 if (index === index.parent().children()[i]) {
258                                         delete index.parent().children()[i];
259                                         break;
260                                 }
261                         }
262
263                         row.previousSibling.firstChild.focus();
264                         row.parentNode.removeChild(row);
265
266                         event.preventDefault();
267                         return false;
268
269                 } else if (event.keyCode == 46 && event.shiftKey) { // shift+del
270
271                         var index;
272                         if (element.localName() == 'subfield') index = element;
273                         if (element.localName() == 'code') index = element.parent();
274
275                         if (index) {
276                                 for (var i in index.parent().children()) {
277                                         if (index === index.parent().children()[i]) {
278                                                 delete index.parent().children()[i];
279                                                 break;
280                                         }
281                                 }
282
283                                 if (event.target.parentNode === event.target.parentNode.parentNode.lastChild) {
284                                         event.target.parentNode.previousSibling.lastChild.focus();
285                                 } else {
286                                         event.target.parentNode.nextSibling.firstChild.nextSibling.focus();
287                                 }
288
289                                 event.target.parentNode.parentNode.removeChild(event.target.parentNode);
290
291                                 event.preventDefault();
292                                 return false;
293                         }
294                 }
295                 return true;
296         };
297
298         box.addEventListener(
299                 'keypress', 
300                 function () {
301                         if (element.nodeKind() == 'attribute') element[0]=box.value;
302                         else element.setChildren( box.value );
303                         return true;
304                 },
305                 false
306         );
307
308         box.addEventListener(
309                 'change', 
310                 function () {
311                         if (element.nodeKind() == 'attribute') element[0]=box.value;
312                         else element.setChildren( box.value );
313                         return true;
314                 },
315                 false
316         );
317
318         box.addEventListener(
319                 'keypress', 
320                 function () {
321                         if (element.nodeKind() == 'attribute') element[0]=box.value;
322                         else element.setChildren( box.value );
323                         return true;
324                 },
325                 true
326         );
327
328         return box;
329 }
330
331 var rec_type = {
332         BKS : { Type : /[at]{1}/,       BLvl : /[acdm]{1}/ },
333         SER : { Type : /[a]{1}/,        BLvl : /[bs]{1}/ },
334         VIS : { Type : /[gkro]{1}/,     BLvl : /[abcdms]{1}/ },
335         MIX : { Type : /[p]{1}/,        BLvl : /[cd]{1}/ },
336         MAP : { Type : /[ef]{1}/,       BLvl : /[abcdms]{1}/ },
337         SCO : { Type : /[cd]{1}/,       BLvl : /[abcdms]{1}/ },
338         REC : { Type : /[ij]{1}/,       BLvl : /[abcdms]{1}/ },
339         COM : { Type : /[m]{1}/,        BLvl : /[abcdms]{1}/ }
340 };
341
342 var ff_pos = {
343         Ctry : {
344                 _8 : {
345                         BKS : {start : 15, len : 3, def : ' ' },
346                         SER : {start : 15, len : 3, def : ' ' },
347                         VIS : {start : 15, len : 3, def : ' ' },
348                         MIX : {start : 15, len : 3, def : ' ' },
349                         MAP : {start : 15, len : 3, def : ' ' },
350                         SCO : {start : 15, len : 3, def : ' ' },
351                         REC : {start : 15, len : 3, def : ' ' },
352                         COM : {start : 15, len : 3, def : ' ' },
353                 }
354         },
355         Lang : {
356                 _8 : {
357                         BKS : {start : 35, len : 3, def : ' ' },
358                         SER : {start : 35, len : 3, def : ' ' },
359                         VIS : {start : 35, len : 3, def : ' ' },
360                         MIX : {start : 35, len : 3, def : ' ' },
361                         MAP : {start : 35, len : 3, def : ' ' },
362                         SCO : {start : 35, len : 3, def : ' ' },
363                         REC : {start : 35, len : 3, def : ' ' },
364                         COM : {start : 35, len : 3, def : ' ' },
365                 }
366         },
367         MRec : {
368                 _8 : {
369                         BKS : {start : 38, len : 1, def : ' ' },
370                         SER : {start : 38, len : 1, def : ' ' },
371                         VIS : {start : 38, len : 1, def : ' ' },
372                         MIX : {start : 38, len : 1, def : ' ' },
373                         MAP : {start : 38, len : 1, def : ' ' },
374                         SCO : {start : 38, len : 1, def : ' ' },
375                         REC : {start : 38, len : 1, def : ' ' },
376                         COM : {start : 38, len : 1, def : ' ' },
377                 }
378         },
379         DtSt : {
380                 _8 : {
381                         BKS : {start : 6, len : 1, def : ' ' },
382                         SER : {start : 6, len : 1, def : 'c' },
383                         VIS : {start : 6, len : 1, def : ' ' },
384                         MIX : {start : 6, len : 1, def : ' ' },
385                         MAP : {start : 6, len : 1, def : ' ' },
386                         SCO : {start : 6, len : 1, def : ' ' },
387                         REC : {start : 6, len : 1, def : ' ' },
388                         COM : {start : 6, len : 1, def : ' ' },
389                 }
390         },
391         Type : {
392                 ldr : {
393                         BKS : {start : 6, len : 1, def : 'a' },
394                         SER : {start : 6, len : 1, def : 'a' },
395                         VIS : {start : 6, len : 1, def : 'g' },
396                         MIX : {start : 6, len : 1, def : 'p' },
397                         MAP : {start : 6, len : 1, def : 'e' },
398                         SCO : {start : 6, len : 1, def : 'c' },
399                         REC : {start : 6, len : 1, def : 'i' },
400                         COM : {start : 6, len : 1, def : 'm' },
401                 }
402         },
403         Ctrl : {
404                 ldr : {
405                         BKS : {start : 8, len : 1, def : ' ' },
406                         SER : {start : 8, len : 1, def : ' ' },
407                         VIS : {start : 8, len : 1, def : ' ' },
408                         MIX : {start : 8, len : 1, def : ' ' },
409                         MAP : {start : 8, len : 1, def : ' ' },
410                         SCO : {start : 8, len : 1, def : ' ' },
411                         REC : {start : 8, len : 1, def : ' ' },
412                         COM : {start : 8, len : 1, def : ' ' },
413                 }
414         },
415         BLvl : {
416                 ldr : {
417                         BKS : {start : 7, len : 1, def : 'm' },
418                         SER : {start : 7, len : 1, def : 's' },
419                         VIS : {start : 7, len : 1, def : 'm' },
420                         MIX : {start : 7, len : 1, def : 'c' },
421                         MAP : {start : 7, len : 1, def : 'm' },
422                         SCO : {start : 7, len : 1, def : 'm' },
423                         REC : {start : 7, len : 1, def : 'm' },
424                         COM : {start : 7, len : 1, def : 'm' },
425                 }
426         },
427         Desc : {
428                 ldr : {
429                         BKS : {start : 18, len : 1, def : ' ' },
430                         SER : {start : 18, len : 1, def : ' ' },
431                         VIS : {start : 18, len : 1, def : ' ' },
432                         MIX : {start : 18, len : 1, def : ' ' },
433                         MAP : {start : 18, len : 1, def : ' ' },
434                         SCO : {start : 18, len : 1, def : ' ' },
435                         REC : {start : 18, len : 1, def : ' ' },
436                         COM : {start : 18, len : 1, def : ' ' },
437                 }
438         },
439         ELvl : {
440                 ldr : {
441                         BKS : {start : 17, len : 1, def : ' ' },
442                         SER : {start : 17, len : 1, def : ' ' },
443                         VIS : {start : 17, len : 1, def : ' ' },
444                         MIX : {start : 17, len : 1, def : ' ' },
445                         MAP : {start : 17, len : 1, def : ' ' },
446                         SCO : {start : 17, len : 1, def : ' ' },
447                         REC : {start : 17, len : 1, def : ' ' },
448                         COM : {start : 17, len : 1, def : ' ' },
449                 }
450         },
451         Indx : {
452                 _8 : {
453                         BKS : {start : 31, len : 1, def : '0' },
454                         MAP : {start : 31, len : 1, def : '0' },
455                 },
456                 _6 : {
457                         BKS : {start : 14, len : 1, def : '0' },
458                         MAP : {start : 14, len : 1, def : '0' },
459                 }
460         },
461         Date1 : {
462                 _8 : {
463                         BKS : {start : 7, len : 4, def : ' ' },
464                         SER : {start : 7, len : 4, def : ' ' },
465                         VIS : {start : 7, len : 4, def : ' ' },
466                         MIX : {start : 7, len : 4, def : ' ' },
467                         MAP : {start : 7, len : 4, def : ' ' },
468                         SCO : {start : 7, len : 4, def : ' ' },
469                         REC : {start : 7, len : 4, def : ' ' },
470                         COM : {start : 7, len : 4, def : ' ' },
471                 },
472         },
473         Date2 : {
474                 _8 : {
475                         BKS : {start : 11, len : 4, def : ' ' },
476                         SER : {start : 11, len : 4, def : '9' },
477                         VIS : {start : 11, len : 4, def : ' ' },
478                         MIX : {start : 11, len : 4, def : ' ' },
479                         MAP : {start : 11, len : 4, def : ' ' },
480                         SCO : {start : 11, len : 4, def : ' ' },
481                         REC : {start : 11, len : 4, def : ' ' },
482                         COM : {start : 11, len : 4, def : ' ' },
483                 },
484         },
485         LitF : {
486                 _8 : {
487                         BKS : {start : 33, len : 1, def : '0' },
488                 },
489                 _6 : {
490                         BKS : {start : 16, len : 1, def : '0' },
491                 }
492         },
493         Biog : {
494                 _8 : {
495                         BKS : {start : 34, len : 1, def : ' ' },
496                 },
497                 _6 : {
498                         BKS : {start : 17, len : 1, def : ' ' },
499                 }
500         },
501         Ills : {
502                 _8 : {
503                         BKS : {start : 18, len : 4, def : ' ' },
504                 },
505                 _6 : {
506                         BKS : {start : 1, len : 4, def : ' ' },
507                 }
508         },
509         Fest : {
510                 _8 : {
511                         BKS : {start : 30, len : 1, def : '0' },
512                 },
513                 _6 : {
514                         BKS : {start : 13, len : 1, def : '0' },
515                 }
516         },
517         Conf : {
518                 _8 : {
519                         BKS : {start : 24, len : 4, def : ' ' },
520                         SER : {start : 25, len : 3, def : ' ' },
521                 },
522                 _6 : {
523                         BKS : {start : 7, len : 4, def : ' ' },
524                         SER : {start : 8, len : 3, def : ' ' },
525                 }
526         },
527         GPub : {
528                 _8 : {
529                         BKS : {start : 28, len : 1, def : ' ' },
530                         SER : {start : 28, len : 1, def : ' ' },
531                         VIS : {start : 28, len : 1, def : ' ' },
532                         MAP : {start : 28, len : 1, def : ' ' },
533                         COM : {start : 28, len : 1, def : ' ' },
534                 },
535                 _6 : {
536                         BKS : {start : 11, len : 1, def : ' ' },
537                         SER : {start : 11, len : 1, def : ' ' },
538                         VIS : {start : 11, len : 1, def : ' ' },
539                         MAP : {start : 11, len : 1, def : ' ' },
540                         COM : {start : 11, len : 1, def : ' ' },
541                 }
542         },
543         Audn : {
544                 _8 : {
545                         BKS : {start : 22, len : 1, def : ' ' },
546                         SER : {start : 22, len : 1, def : ' ' },
547                         VIS : {start : 22, len : 1, def : ' ' },
548                         SCO : {start : 22, len : 1, def : ' ' },
549                         REC : {start : 22, len : 1, def : ' ' },
550                         COM : {start : 22, len : 1, def : ' ' },
551                 },
552                 _6 : {
553                         BKS : {start : 5, len : 1, def : ' ' },
554                         SER : {start : 5, len : 1, def : ' ' },
555                         VIS : {start : 5, len : 1, def : ' ' },
556                         SCO : {start : 5, len : 1, def : ' ' },
557                         REC : {start : 5, len : 1, def : ' ' },
558                         COM : {start : 5, len : 1, def : ' ' },
559                 }
560         },
561         Form : {
562                 _8 : {
563                         BKS : {start : 23, len : 1, def : ' ' },
564                         SER : {start : 23, len : 1, def : ' ' },
565                         VIS : {start : 29, len : 1, def : ' ' },
566                         MIX : {start : 23, len : 1, def : ' ' },
567                         MAP : {start : 29, len : 1, def : ' ' },
568                         SCO : {start : 23, len : 1, def : ' ' },
569                         REC : {start : 23, len : 1, def : ' ' },
570                 },
571                 _6 : {
572                         BKS : {start : 6, len : 1, def : ' ' },
573                         SER : {start : 6, len : 1, def : ' ' },
574                         VIS : {start : 12, len : 1, def : ' ' },
575                         MIX : {start : 6, len : 1, def : ' ' },
576                         MAP : {start : 12, len : 1, def : ' ' },
577                         SCO : {start : 6, len : 1, def : ' ' },
578                         REC : {start : 6, len : 1, def : ' ' },
579                 }
580         },
581         'S/L' : {
582                 _8 : {
583                         SER : {start : 34, len : 1, def : '0' },
584                 },
585                 _6 : {
586                         SER : {start : 17, len : 1, def : '0' },
587                 }
588         },
589         'Alph' : {
590                 _8 : {
591                         SER : {start : 33, len : 1, def : ' ' },
592                 },
593                 _6 : {
594                         SER : {start : 16, len : 1, def : ' ' },
595                 }
596         },
597 };
598
599 function recordType (rec) {
600         try {
601                 var _l = rec.leader.toString();
602
603                 var _t = _l.substr(ff_pos.Type.ldr.BKS.start, ff_pos.Type.ldr.BKS.len);
604                 var _b = _l.substr(ff_pos.BLvl.ldr.BKS.start, ff_pos.BLvl.ldr.BKS.len);
605
606                 for (var t in rec_type) {
607                         if (_t.match(rec_type[t].Type) && _b.match(rec_type[t].BLvl)) {
608                                 document.getElementById('recordTypeLabel').value = t;
609                         _record_type = t;
610                                 return t;
611                         }
612                 }
613         } catch(E) {
614                 alert('FIXME, MARC Editor, recordType: ' + E);
615         }
616 }
617
618 function toggleFFE () {
619         var grid = document.getElementById('leaderGrid');
620         if (grid.hidden) {
621                 grid.hidden = false;
622         } else {
623                 grid.hidden = true;
624         }
625         return true;
626 }
627
628 function changeFFEditor (type) {
629         var grid = document.getElementById('leaderGrid');
630         grid.setAttribute('type',type);
631 }
632
633 function fillFixedFields (rec) {
634         try {
635                         var grid = document.getElementById('leaderGrid');
636
637                         var rtype = _record_type;
638
639                         var _l = rec.leader.toString();
640                         var _6 = rec.controlfield.(@tag=='006').toString();
641                         var _7 = rec.controlfield.(@tag=='007').toString();
642                         var _8 = rec.controlfield.(@tag=='008').toString();
643
644                         var list = [];
645                         var pre_list = grid.getElementsByTagName('label');
646                         for (var i in pre_list) {
647                                 if ( pre_list[i].getAttribute && pre_list[i].getAttribute('set').indexOf(grid.getAttribute('type')) > -1 ) {
648                                         list.push( pre_list[i] );
649                                 }
650                         }
651
652                         for (var i in list) {
653                                 var name = list[i].getAttribute('name');
654
655                                 if (!ff_pos[name])
656                                         continue;
657
658                                 var value = '';
659                                 if ( ff_pos[name].ldr && ff_pos[name].ldr[rtype] )
660                                         value = _l.substr(ff_pos[name].ldr[rtype].start, ff_pos[name].ldr[rtype].len);
661
662                                 if ( ff_pos[name]._8 && ff_pos[name]._8[rtype] )
663                                         value = _8.substr(ff_pos[name]._8[rtype].start, ff_pos[name]._8[rtype].len);
664
665                                 if ( !value && ff_pos[name]._6 && ff_pos[name]._6[rtype] )
666                                         value = _6.substr(ff_pos[name]._6[rtype].start, ff_pos[name]._6[rtype].len);
667
668                                 if ( ff_pos[name]._7 && ff_pos[name]._7[rtype] )
669                                         value = _7.substr(ff_pos[name]._7[rtype].start, ff_pos[name]._7[rtype].len);
670                                 
671                                 if (!value) {
672                                         var d;
673                                         var p;
674                                         if (ff_pos[name].ldr && ff_pos[name].ldr[rtype]) {
675                                                 d = ff_pos[name].ldr[rtype].def;
676                                                 p = 'ldr';
677                                         }
678
679                                         if (ff_pos[name]._8 && ff_pos[name]._8[rtype]) {
680                                                 d = ff_pos[name]._8[rtype].def;
681                                                 p = '_8';
682                                         }
683
684                                         if (!value && ff_pos[name]._6 && ff_pos[name]._6[rtype]) {
685                                                 d = ff_pos[name]._6[rtype].def;
686                                                 p = '_6';
687                                         }
688
689                                         if (ff_pos[name]._7 && ff_pos[name]._7[rtype]) {
690                                                 d = ff_pos[name]._7[rtype].def;
691                                                 p = '_7';
692                                         }
693
694                                         if (!value) {
695                                                 for (var j = 0; j < ff_pos[name][p][rtype].len; j++) {
696                                                         value += d;
697                                                 }
698                                         }
699                                 }
700
701                                 list[i].nextSibling.value = value;
702                         }
703
704                         return true;
705         } catch(E) {
706                 alert('FIXME, MARC Editor, fillFixedFields: ' + E);
707         }
708 }
709
710 function updateFixedFields (element) {
711         var grid = document.getElementById('leaderGrid');
712         var recGrid = document.getElementById('recGrid');
713
714         var rtype = _record_type;
715         var new_value = element.value;
716
717         var parts = {
718                 ldr : _record.leader,
719                 _6 : _record.controlfield.(@tag=='006'),
720                 _7 : _record.controlfield.(@tag=='007'),
721                 _8 : _record.controlfield.(@tag=='008'),
722         };
723
724         var name = element.getAttribute('name');
725         for (var i in ff_pos[name]) {
726
727                 if (!ff_pos[name][i][rtype]) continue;
728                 if (!parts[i]) continue;
729
730                 var before = parts[i].substr(0, ff_pos[name][i][rtype].start);
731                 var after = parts[i].substr(ff_pos[name][i][rtype].start + ff_pos[name][i][rtype].len);
732
733                 for (var j = 0; new_value.length < ff_pos[name][i][rtype].len; j++) {
734                         new_value += ff_pos[name][i][rtype].def;
735                 }
736
737                 parts[i].setChildren( before + new_value + after );
738                 recGrid.getElementsByAttribute('tag',i)[0].lastChild.value = parts[i].toString();
739         }
740
741         return true;
742 }
743
744 function marcLeader (leader) {
745         var row = createRow(
746                 { class : 'marcLeaderRow',
747                   tag : 'ldr' },
748                 createLabel(
749                         { value : 'LDR',
750                           class : 'marcTag',
751                           tooltiptext : "MARC Leader" } ),
752                 createLabel(
753                         { value : '',
754                           class : 'marcInd1' } ),
755                 createLabel(
756                         { value : '',
757                           class : 'marcInd2' } ),
758                 createLabel(
759                         { value : leader.text(),
760                           class : 'marcLeader' } )
761         );
762
763         return row;
764 }
765
766 function marcControlfield (field) {
767         tagname = field.@tag.toString().substr(2);
768         var row = createRow(
769                 { class : 'marcControlfieldRow',
770                   tag : '_' + tagname },
771                 createLabel(
772                         { value : field.@tag,
773                           class : 'marcTag',
774                           onmouseover : 'getTooltip(this, "tag");',
775                           tooltipid : 'tag' + field.@tag } ),
776                 createLabel(
777                         { value : field.@ind1,
778                           class : 'marcInd1',
779                           onmouseover : 'getTooltip(this, "ind1");',
780                           tooltipid : 'tag' + field.@tag + 'ind1val' + field.@ind1 } ),
781                 createLabel(
782                         { value : field.@ind2,
783                           class : 'marcInd2',
784                           onmouseover : 'getTooltip(this, "ind2");',
785                           tooltipid : 'tag' + field.@tag + 'ind2val' + field.@ind2 } ),
786                 createLabel(
787                         { value : field.text(),
788                           class : 'marcControlfield' } )
789         );
790
791         return row;
792 }
793
794 function stackSubfields(checkbox) {
795         var list = document.getElementsByAttribute('name','sf_box');
796
797         var o = 'vertical';
798         if (checkbox.checked) o = 'horizontal';
799         
800         for (var i = 0; i < list.length; i++) {
801                 if (list[i]) list[i].setAttribute('orient',o);
802         }
803 }
804
805 function marcDatafield (field) {
806         var row = createRow(
807                 { class : 'marcDatafieldRow' },
808                 createMARCTextbox(
809                         field.@tag,
810                         { value : field.@tag,
811                           class : 'plain marcTag',
812                           name : 'marcTag',
813                           context : 'tags_popup',
814                           oninput : 'if (this.value.length == 3) { this.nextSibling.focus(); }',
815                           size : 3,
816                           maxlength : 3,
817                           onmouseover : 'current_focus = this; getTooltip(this, "tag");' } ),
818                 createMARCTextbox(
819                         field.@ind1,
820                         { value : field.@ind1,
821                           class : 'plain marcInd1',
822                           name : 'marcInd1',
823                           oninput : 'if (this.value.length == 1) { this.nextSibling.focus(); }',
824                           size : 1,
825                           maxlength : 1,
826                           onmouseover : 'current_focus = this; getContextMenu(this, "ind1"); getTooltip(this, "ind1");',
827                           oncontextmenu : 'getContextMenu(this, "ind1");' } ),
828                 createMARCTextbox(
829                         field.@ind2,
830                         { value : field.@ind2,
831                           class : 'plain marcInd2',
832                           name : 'marcInd2',
833                           oninput : 'if (this.value.length == 1) { this.nextSibling.firstChild.firstChild.focus(); }',
834                           size : 1,
835                           maxlength : 1,
836                           onmouseover : 'current_focus = this; getContextMenu(this, "ind2"); getTooltip(this, "ind2");',
837                           oncontextmenu : 'getContextMenu(this, "ind2");' } ),
838                 createHbox({ name : 'sf_box' })
839         );
840
841         if (!current_focus && field.@tag == '') current_focus = row.childNodes[0];
842         if (!current_focus && field.@ind1 == '') current_focus = row.childNodes[1];
843         if (!current_focus && field.@ind2 == '') current_focus = row.childNodes[2];
844
845         var sf_box = row.lastChild;
846         if (document.getElementById('stackSubfields').checked)
847                 sf_box.setAttribute('orient','vertical');
848
849         sf_box.addEventListener(
850                 'click',
851                 function (e) {
852                         if (sf_box === e.target) {
853                                 sf_box.lastChild.lastChild.focus();
854                         } else if (e.target.parentNode === sf_box) {
855                                 e.target.lastChild.focus();
856                         }
857                 },
858                 false
859         );
860
861
862         for (var i in field.subfield) {
863                 var sf = field.subfield[i];
864                 sf_box.appendChild(
865                         marcSubfield(sf)
866                 );
867
868                 if (sf.@code == '' && (!current_focus || current_focus.className.match(/Ind/)))
869                         current_focus = sf_box.lastChild.childNodes[1];
870         }
871
872         return row;
873 }
874
875 function marcSubfield (sf) {                    
876         return createHbox(
877                 { class : 'marcSubfieldBox' },
878                 createLabel(
879                         { value : "\u2021",
880                           class : 'plain marcSubfieldDelimiter',
881                           onmouseover : 'getTooltip(this.nextSibling, "subfield");',
882                           oncontextmenu : 'getContextMenu(this.nextSibling, "subfield");',
883                           //onclick : 'this.nextSibling.focus();',
884                           onfocus : 'this.nextSibling.focus();',
885                           size : 2 } ),
886                 createMARCTextbox(
887                         sf.@code,
888                         { value : sf.@code,
889                           class : 'plain marcSubfieldCode',
890                           name : 'marcSubfieldCode',
891                           onmouseover : 'current_focus = this; getContextMenu(this, "subfield"); getTooltip(this, "subfield");',
892                           oncontextmenu : 'getContextMenu(this, "subfield");',
893                           oninput : 'if (this.value.length == 1) { this.nextSibling.focus(); }',
894                           size : 2,
895                           maxlength : 1 } ),
896                 createMARCTextbox(
897                         sf,
898                         { value : sf.text(),
899                           name : sf.parent().@tag + ':' + sf.@code,
900                           class : 'plain marcSubfield', 
901                           onmouseover : 'getTooltip(this, "subfield");',
902                           contextmenu : function (event) { getAuthorityContextMenu(event.target, sf) },
903                           size : new String(sf.text()).length + 2,
904                           oninput : "this.setAttribute('size', this.value.length + 2);",
905                         } )
906         );
907 }
908
909 function loadRecord(rec) {
910         try {
911                         _record = rec;
912                         var grid_rows = document.getElementById('recGrid').lastChild;
913
914                         grid_rows.appendChild( marcLeader( rec.leader ) );
915
916                         for (var i in rec.controlfield) {
917                                 grid_rows.appendChild( marcControlfield( rec.controlfield[i] ) );
918                         }
919
920                         for (var i in rec.datafield) {
921                                 grid_rows.appendChild( marcDatafield( rec.datafield[i] ) );
922                         }
923
924                         grid_rows.getElementsByAttribute('class','marcDatafieldRow')[0].firstChild.focus();
925                         changeFFEditor(recordType(rec));
926                         fillFixedFields(rec);
927         } catch(E) {
928                 alert('FIXME, MARC Editor, loadRecord: ' + E);
929         }
930 }
931
932 var context_menus = createComplexXULElement('popupset');
933 document.documentElement.appendChild( context_menus );
934
935 var tag_menu = createPopup({position : 'after_start', id : 'tags_popup'});
936 context_menus.appendChild( tag_menu );
937
938 tag_menu.appendChild(
939         createMenuitem(
940                 { label : 'Add Row',
941                   oncommand : 
942                         'var e = document.createEvent("KeyEvents");' +
943                         'e.initKeyEvent("keypress",1,1,null,1,0,0,0,13,0);' +
944                         'current_focus.inputField.dispatchEvent(e);',
945                  }
946         )
947 );
948
949 tag_menu.appendChild(
950         createMenuitem(
951                 { label : 'Remove Row',
952                   oncommand : 
953                         'var e = document.createEvent("KeyEvents");' +
954                         'e.initKeyEvent("keypress",1,1,null,1,0,0,0,46,0);' +
955                         'current_focus.inputField.dispatchEvent(e);',
956                 }
957         )
958 );
959
960 tag_menu.appendChild( createComplexXULElement( 'separator' ) );
961
962
963
964 function genToolTips () {
965         for (var i in bib_data.field) {
966                 var f = bib_data.field[i];
967         
968                 tag_menu.appendChild(
969                         createMenuitem(
970                                 { label : f.@tag,
971                                   oncommand : 
972                                         'current_focus.value = "' + f.@tag + '";' +
973                                         'var e = document.createEvent("MutationEvents");' +
974                                         'e.initMutationEvent("change",1,1,null,0,0,0,0);' +
975                                         'current_focus.inputField.dispatchEvent(e);',
976                                   disabled : f.@tag < '010' ? "true" : "false",
977                                   tooltiptext : f.description }
978                         )
979                 );
980         
981                 var i1_popup = createPopup({position : 'after_start', id : 't' + f.@tag + 'i1' });
982                 context_menus.appendChild( i1_popup );
983         
984                 var i2_popup = createPopup({position : 'after_start', id : 't' + f.@tag + 'i2' });
985                 context_menus.appendChild( i2_popup );
986         
987                 var sf_popup = createPopup({position : 'after_start', id : 't' + f.@tag + 'sf' });
988                 context_menus.appendChild( sf_popup );
989         
990                 tooltip_hash['tag' + f.@tag] = f.description;
991                 for (var j in f.indicator) {
992                         var ind = f.indicator[j];
993                         tooltip_hash['tag' + f.@tag + 'ind' + ind.@position + 'val' + ind.@value] = ind.description;
994         
995                         if (ind.@position == 1) {
996                                 i1_popup.appendChild(
997                                         createMenuitem(
998                                                 { label : ind.@value,
999                                                   oncommand : 
1000                                                         'current_focus.value = "' + ind.@value + '";' +
1001                                                         'var e = document.createEvent("MutationEvents");' +
1002                                                         'e.initMutationEvent("change",1,1,null,0,0,0,0);' +
1003                                                         'current_focus.inputField.dispatchEvent(e);',
1004                                                   tooltiptext : ind.description }
1005                                         )
1006                                 );
1007                         }
1008         
1009                         if (ind.@position == 2) {
1010                                 i2_popup.appendChild(
1011                                         createMenuitem(
1012                                                 { label : ind.@value,
1013                                                   oncommand : 
1014                                                         'current_focus.value = "' + ind.@value + '";' +
1015                                                         'var e = document.createEvent("MutationEvents");' +
1016                                                         'e.initMutationEvent("change",1,1,null,0,0,0,0);' +
1017                                                         'current_focus.inputField.dispatchEvent(e);',
1018                                                   tooltiptext : ind.description }
1019                                         )
1020                                 );
1021                         }
1022                 }
1023         
1024                 for (var j in f.subfield) {
1025                         var sf = f.subfield[j];
1026                         tooltip_hash['tag' + f.@tag + 'sf' + sf.@code] = sf.description;
1027         
1028                         sf_popup.appendChild(
1029                                 createMenuitem(
1030                                         { label : sf.@code,
1031                                           oncommand : 
1032                                                 'current_focus.value = "' + sf.@code + '";' +
1033                                                 'var e = document.createEvent("MutationEvents");' +
1034                                                 'e.initMutationEvent("change",1,1,null,0,0,0,0);' +
1035                                                 'current_focus.inputField.dispatchEvent(e);',
1036                                           tooltiptext : sf.description,
1037                                         }
1038                                 )
1039                         );
1040                 }
1041         }
1042 }
1043
1044 var p = createComplexXULElement('popupset');
1045 document.documentElement.appendChild( p );
1046
1047 function getTooltip (target, type) {
1048
1049         var tt = '';
1050         if (type == 'subfield')
1051                 tt = 'tag' + target.parentNode.parentNode.parentNode.firstChild.value + 'sf' + target.parentNode.childNodes[1].value;
1052
1053         if (type == 'ind1')
1054                 tt = 'tag' + target.parentNode.firstChild.value + 'ind1val' + target.value;
1055
1056         if (type == 'ind2')
1057                 tt = 'tag' + target.parentNode.firstChild.value + 'ind2val' + target.value;
1058
1059         if (type == 'tag')
1060                 tt = 'tag' + target.parentNode.firstChild.value;
1061
1062         if (!document.getElementById( tt )) {
1063                 p.appendChild(
1064                         createTooltip(
1065                                 { id : tt,
1066                                   flex : "1",
1067                                   orient : 'vertical',
1068                                   onpopupshown : 'this.width = this.firstChild.boxObject.width + 10; this.height = this.firstChild.boxObject.height + 10;',
1069                                   class : 'tooltip' },
1070                                 createDescription({}, document.createTextNode( tooltip_hash[tt] ) )
1071                         )
1072                 );
1073         }
1074
1075         target.tooltip = tt;
1076         return true;
1077 }
1078
1079 function getContextMenu (target, type) {
1080
1081         var tt = '';
1082         if (type == 'subfield')
1083                 tt = 't' + target.parentNode.parentNode.parentNode.firstChild.value + 'sf';
1084
1085         if (type == 'ind1')
1086                 tt = 't' + target.parentNode.firstChild.value + 'i1';
1087
1088         if (type == 'ind2')
1089                 tt = 't' + target.parentNode.firstChild.value + 'i2';
1090
1091         target.setAttribute('context', tt);
1092         return true;
1093 }
1094
1095 var authority_tag_map = {
1096         100 : ['[100,400,500,700]',100],
1097         400 : ['[100,400,500,700]',100],
1098         700 : ['[100,400,500,700]',100],
1099         800 : ['[100,400,500,700]',100],
1100         110 : ['[110,410,510,710]',110],
1101         410 : ['[110,410,510,710]',110],
1102         710 : ['[110,410,510,710]',110],
1103         810 : ['[110,410,510,710]',110],
1104         111 : ['[111,411,511,711]',111],
1105         411 : ['[111,411,511,711]',111],
1106         711 : ['[111,411,511,711]',111],
1107         811 : ['[111,411,511,711]',111],
1108         240 : ['[130,430,530,730]',130],
1109         440 : ['[130,430,530,730]',130],
1110         130 : ['[130,430,530,730]',130],
1111         730 : ['[130,430,530,730]',130],
1112         830 : ['[130,430,530,730]',130],
1113         600 : ['[100,400,480,481,482,485,500,580,581,582,585,700,780,781,782,785]',100],
1114         650 : ['[150,450,480,481,482,485,550,580,581,582,585,750,780,781,782,785]',150],
1115         651 : ['[151,451,480,481,482,485,551,580,581,582,585,751,780,781,782,785]',151],
1116         655 : ['[155,455,480,481,482,485,555,580,581,582,585,755,780,781,782,785]',155],
1117 };
1118
1119 function getAuthorityContextMenu (target, sf) {
1120         var menu_id = sf.parent().@tag + ':' + sf.@code + '-authority-context-' + sf;
1121
1122         var old = document.getElementById( menu_id );
1123         if (old) old.parentNode.removeChild(old);
1124
1125         var sf_popup = createPopup({ id : menu_id, flex : 1 });
1126         context_menus.appendChild( sf_popup );
1127
1128         if (!authority_tag_map[sf.parent().@tag]) {
1129                 sf_popup.appendChild(createLabel( { value : "Not a controlled subfield" } ) );
1130                 target.setAttribute('context', menu_id);
1131                 return false;
1132         }
1133
1134         var auth_data = searchAuthority( sf, authority_tag_map[sf.parent().@tag][0], sf.@code, 50);
1135
1136         var res = new XML( auth_data.responseText );
1137
1138         var rec_list = [];
1139
1140         var recs = res.gw::payload.gw::array.gw::string;
1141         for (var i in recs) {
1142                 var x = recs[i];
1143                 var xml = new XML(x.toString());
1144                 var main = xml.datafield.(@tag.toString().match(/^1/)).subfield;
1145
1146                 if (! (main[0].parent().@tag == authority_tag_map[sf.parent().@tag][1]) ) continue;
1147
1148                 var main_text = '';
1149                 for (var i in main) {
1150                         if (main_text) main_text += ' / ';
1151                         main_text += main[i];
1152                 }
1153
1154                 rec_list.push( [ main_text, xml ] );
1155         }
1156         
1157         for (var i in rec_list.sort( function (a, b) { if(a[0] > b[0]) return 1; return -1; } )) {
1158
1159                 var main_text = rec_list[i][0];
1160                 var xml = rec_list[i][1];
1161                 var main = xml.datafield.(@tag.toString().match(/^1/)).subfield;
1162
1163                 if (! (main[0].parent().@tag == authority_tag_map[sf.parent().@tag][1]) ) continue;
1164
1165                 var grid = document.getElementsByAttribute('name','authority-marc-template')[0].cloneNode(true);
1166                 grid.setAttribute('name','-none-');
1167                 grid.setAttribute('style','overflow:scroll');
1168
1169
1170                 var submenu = createMenu( { label : main_text } );
1171
1172                 var popup = createMenuPopup({ flex : "1" });
1173                 submenu.appendChild(popup);
1174
1175                 var fields = xml.datafield;
1176                 for (var j in fields) {
1177
1178                         var row = createRow(
1179                                 {},
1180                                 createLabel( { value : fields[j].@tag } ),
1181                                 createLabel( { value : fields[j].@ind1 } ),
1182                                 createLabel( { value : fields[j].@ind2 } )
1183                         );
1184
1185                         var sf_box = createHbox();
1186
1187                         var subfields = fields[j].subfield;
1188                         for (var k in subfields) {
1189                                 sf_box.appendChild(
1190                                         createCheckbox(
1191                                                 { label    : '\u2021' + subfields[k].@code + ' ' + subfields[k],
1192                                                   subfield : subfields[k].@code,
1193                                                   tag      : subfields[k].parent().@tag,
1194                                                   value    : subfields[k]
1195                                                 }
1196                                         )
1197                                 );
1198                                 row.appendChild(sf_box);
1199                         }
1200
1201                         grid.lastChild.appendChild(row);
1202                 }
1203
1204                 grid.hidden = false;
1205                 popup.appendChild( grid );
1206
1207                 popup.appendChild(
1208                         createMenuitem(
1209                                 { label : 'Apply Selected',
1210                                   command : function (event) {
1211                                                 applyAuthority(event.target.previousSibling, target, sf);
1212                                                 return true;
1213                                   },
1214                                 }
1215                         )
1216                 );
1217
1218                 sf_popup.appendChild( submenu );
1219         }
1220
1221         if (sf_popup.childNodes.length == 0)
1222                 sf_popup.appendChild(createLabel( { value : "No matching authority records found" } ) );
1223
1224         target.setAttribute('context', menu_id);
1225         return true;
1226 }
1227
1228 function applyAuthority ( target, ui_sf, e4x_sf ) {
1229
1230         var new_vals = target.getElementsByAttribute('checked','true');
1231         var field = e4x_sf.parent();
1232
1233         for (var i = 0; i < new_vals.length; i++) {
1234
1235                 var sf_list = field.subfield;
1236                 for (var j in sf_list) {
1237
1238                         if (sf_list[j].@code == new_vals[i].getAttribute('subfield')) {
1239                                 sf_list[j] = new_vals[i].getAttribute('value');
1240                                 new_vals[i].setAttribute('subfield','');
1241                                 break;
1242                         }
1243                 }
1244         }
1245
1246         for (var i = 0; i < new_vals.length; i++) {
1247                 if (!new_vals[i].getAttribute('subfield')) continue;
1248
1249                 var val = new_vals[i].getAttribute('value');
1250
1251                 var sf = <subfield code="" xmlns="http://www.loc.gov/MARC21/slim">{val}</subfield>;
1252                 sf.@code = new_vals[i].getAttribute('subfield');
1253
1254                 field.insertChildAfter(field.subfield[field.subfield.length() - 1], sf);
1255         }
1256
1257         var row = marcDatafield( field );
1258
1259         var node = ui_sf;
1260         while (node.nodeName != 'row') {
1261                 node = node.parentNode;
1262         }
1263
1264         node.parentNode.replaceChild( row, node );
1265         return true;
1266 }
1267
1268 var control_map = {
1269         100 : {
1270                 'a' : { 100 : 'a' },
1271                 'd' : { 100 : 'd' },
1272         },
1273         110 : {
1274                 'a' : { 110 : 'a' },
1275                 'd' : { 110 : 'd' },
1276         },
1277         111 : {
1278                 'a' : { 111 : 'a' },
1279                 'd' : { 111 : 'd' },
1280         },
1281         130 : {
1282                 'a' : { 130 : 'a' },
1283                 'd' : { 130 : 'd' },
1284         },
1285         240 : {
1286                 'a' : { 130 : 'a' },
1287                 'd' : { 130 : 'd' },
1288         },
1289         400 : {
1290                 'a' : { 100 : 'a' },
1291                 'd' : { 100 : 'd' },
1292         },
1293         410 : {
1294                 'a' : { 110 : 'a' },
1295                 'd' : { 110 : 'd' },
1296         },
1297         411 : {
1298                 'a' : { 111 : 'a' },
1299                 'd' : { 111 : 'd' },
1300         },
1301         440 : {
1302                 'a' : { 130 : 'a' },
1303                 'n' : { 130 : 'n' },
1304                 'p' : { 130 : 'p' },
1305         },
1306         700 : {
1307                 'a' : { 100 : 'a' },
1308                 'd' : { 100 : 'd' },
1309         },
1310         710 : {
1311                 'a' : { 110 : 'a' },
1312                 'd' : { 110 : 'd' },
1313         },
1314         711 : {
1315                 'a' : { 111 : 'a' },
1316                 'd' : { 111 : 'd' },
1317         },
1318         730 : {
1319                 'a' : { 130 : 'a' },
1320                 'd' : { 130 : 'd' },
1321         },
1322         800 : {
1323                 'a' : { 100 : 'a' },
1324                 'd' : { 100 : 'd' },
1325         },
1326         810 : {
1327                 'a' : { 110 : 'a' },
1328                 'd' : { 110 : 'd' },
1329         },
1330         811 : {
1331                 'a' : { 111 : 'a' },
1332                 'd' : { 111 : 'd' },
1333         },
1334         830 : {
1335                 'a' : { 130 : 'a' },
1336                 'd' : { 130 : 'd' },
1337         },
1338         600 : {
1339                 'a' : { 100 : 'a' },
1340                 'd' : { 100 : 'd' },
1341                 't' : { 100 : 't' },
1342                 'v' : { 180 : 'v',
1343                         100 : 'v',
1344                         181 : 'v',
1345                         182 : 'v',
1346                         185 : 'v',
1347                 },
1348                 'x' : { 180 : 'x',
1349                         100 : 'x',
1350                         181 : 'x',
1351                         182 : 'x',
1352                         185 : 'x',
1353                 },
1354                 'y' : { 180 : 'y',
1355                         100 : 'y',
1356                         181 : 'y',
1357                         182 : 'y',
1358                         185 : 'y',
1359                 },
1360                 'z' : { 180 : 'z',
1361                         100 : 'z',
1362                         181 : 'z',
1363                         182 : 'z',
1364                         185 : 'z',
1365                 },
1366         },
1367         650 : {
1368                 'a' : { 150 : 'a' },
1369                 'b' : { 150 : 'b' },
1370                 'v' : { 180 : 'v',
1371                         150 : 'v',
1372                         181 : 'v',
1373                         182 : 'v',
1374                         185 : 'v',
1375                 },
1376                 'x' : { 180 : 'x',
1377                         150 : 'x',
1378                         181 : 'x',
1379                         182 : 'x',
1380                         185 : 'x',
1381                 },
1382                 'y' : { 180 : 'y',
1383                         150 : 'y',
1384                         181 : 'y',
1385                         182 : 'y',
1386                         185 : 'y',
1387                 },
1388                 'z' : { 180 : 'z',
1389                         150 : 'z',
1390                         181 : 'z',
1391                         182 : 'z',
1392                         185 : 'z',
1393                 },
1394         },
1395         651 : {
1396                 'a' : { 151 : 'a' },
1397                 'v' : { 180 : 'v',
1398                         151 : 'v',
1399                         181 : 'v',
1400                         182 : 'v',
1401                         185 : 'v',
1402                 },
1403                 'x' : { 180 : 'x',
1404                         151 : 'x',
1405                         181 : 'x',
1406                         182 : 'x',
1407                         185 : 'x',
1408                 },
1409                 'y' : { 180 : 'y',
1410                         151 : 'y',
1411                         181 : 'y',
1412                         182 : 'y',
1413                         185 : 'y',
1414                 },
1415                 'z' : { 180 : 'z',
1416                         151 : 'z',
1417                         181 : 'z',
1418                         182 : 'z',
1419                         185 : 'z',
1420                 },
1421         },
1422         655 : {
1423                 'a' : { 155 : 'a' },
1424                 'v' : { 180 : 'v',
1425                         155 : 'v',
1426                         181 : 'v',
1427                         182 : 'v',
1428                         185 : 'v',
1429                 },
1430                 'x' : { 180 : 'x',
1431                         155 : 'x',
1432                         181 : 'x',
1433                         182 : 'x',
1434                         185 : 'x',
1435                 },
1436                 'y' : { 180 : 'y',
1437                         155 : 'y',
1438                         181 : 'y',
1439                         182 : 'y',
1440                         185 : 'y',
1441                 },
1442                 'z' : { 180 : 'z',
1443                         155 : 'z',
1444                         181 : 'z',
1445                         182 : 'z',
1446                         185 : 'z',
1447                 },
1448         },
1449 };
1450
1451 function validateAuthority (button) {
1452         var grid = document.getElementById('recGrid');
1453         var label = button.getAttribute('label');
1454
1455         //loop over rows
1456         var rows = grid.lastChild.childNodes;
1457         for (var i = 0; i < rows.length; i++) {
1458                 var row = rows[i];
1459                 var tag = row.firstChild;
1460
1461                 if (!control_map[tag.value]) continue
1462
1463                 var ind1 = tag.nextSibling;
1464                 var ind2 = ind1.nextSibling;
1465                 var subfields = ind2.nextSibling.childNodes;
1466
1467                 for (var j = 0; j < subfields.length; j++) {
1468                         var sf = subfields[j];
1469
1470                         if (!control_map[tag.value][sf.childNodes[1].value]) continue;
1471
1472                         button.setAttribute('label', label + ' - ' + tag.value + sf.childNodes[1].value);
1473
1474                         var found = 0;
1475                         for (var k in control_map[tag.value][sf.childNodes[1].value]) {
1476                                 var x = searchAuthority(sf.childNodes[2].value, k, control_map[tag.value][sf.childNodes[1].value][k], 1);
1477                                 var res = new XML( x.responseText );
1478
1479                                 if (res.gw::payload.gw::array.gw::string.length()) {
1480                                         found = 1;
1481                                         break;
1482                                 }
1483                         }
1484
1485                         if (!found) {
1486                                 sf.childNodes[2].inputField.style.color = 'red';
1487                         } else {
1488                                 sf.childNodes[2].inputField.style.color = 'black';
1489                         }
1490                 }
1491         }
1492
1493         button.setAttribute('label', label);
1494
1495         return true;
1496 }
1497
1498
1499 function searchAuthority (term, tag, sf, limit) {
1500         var url = "/gateway?format=xml&service=open-ils.search&method=open-ils.search.authority.fts";
1501         url += '&param="term"&param="' + term + '"';
1502         url += '&param="limit"&param=' + limit;
1503         url += '&param="tag"&param=' + tag;
1504         url += '&param="subfield"&param="' + sf + '"';
1505
1506
1507         var req = new XMLHttpRequest();
1508         req.open('GET',url,false);
1509         req.send(null);
1510
1511         return req;
1512
1513 }
1514