]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/ui/default/staff/marcrecord.js
LP#1402797 canonicalize field.postion after inserting or removing fields
[working/Evergreen.git] / Open-ILS / web / js / ui / default / staff / marcrecord.js
1 /* ---------------------------------------------------------------------------
2  * Copyright (C) 2009-2015  Equinox Software, Inc.
3  * Mike Rylander <miker@esilibrary.com>
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  * ---------------------------------------------------------------------------
15  */
16
17 // !!! Head's up !!!
18 // This module requires a /real/ jQuery be used with your
19 // angularjs, so as to avoid using hand-rolled AJAX.
20
21 var MARC = {
22
23     Record : function(kwargs) {
24         if (!kwargs) kwargs = {};
25
26         this.generate008 = function () {
27             var f;
28             var s;
29             var orig008 = '                                        ';
30             var now = new Date();
31             var y = now.getUTCFullYear().toString().substr(2,2);
32             var m = now.getUTCMonth() + 1;
33             if (m < 10) m = '0' + m;
34             var d = now.getUTCDate();
35             if (d < 10) d = '0' + d;
36
37
38             if (f = this.field('008',true)[0]) {
39                 orig008 = f.data;
40             }
41         
42             /* lang code from 041a */
43             var lang = orig008.substr(35, 3);
44             
45             if (f = this.field('041',true)[0]) {
46                 if (s = f.subfield('a',true)[0]) {
47                     if(s[1]) lang = s[1];
48                 }
49             }
50         
51             /* country code from 044a */
52             var country = orig008.substr(15, 3);
53             if (f = this.field('044',true)[0]) {
54                 if (s = f.subfield('a',true)[0]) {
55                     if(s[1]) country = s[1];
56                 }
57             }
58             while (country.length < 3) country = country + ' ';
59             if (country.length > 3) country = country.substr(0,3);
60         
61             /* date1 from 260c */
62             var date1 = now.getUTCFullYear().toString();
63             if (f = this.field('260',true)[0]) {
64                 if (s = f.subfield('c',true)[0]) {
65                     if (s[1]) {
66                         var tmpd = s[1];
67                         tmpd = tmpd.replace(/[^0-9]/g, '');
68                         if (tmpd.match(/^\d\d\d\d/)) {
69                             date1 = tmpd.substr(0, 4);
70                         }
71                     }
72                 }
73             }
74         
75             var date2 = orig008.substr(11, 4);
76             var datetype = orig008.substr(6, 1);
77             var modded = orig008.substr(38, 1);
78             var catsrc = orig008.substr(39, 1);
79         
80             return '' + y + m + d + datetype + date1 + date2 + country + '                 ' + lang + modded + catsrc;
81         
82         }
83
84         this.title = function () { return this.subfield('245','a')[1] }
85
86         this.field = function (spec, wantarray) {
87             var list = this.fields.filter(function (f) {
88                 if (f.tag.match(spec)) return true;
89                 return false;
90             });
91
92             if (!wantarray && list.length == 1) return list[0];
93             return list;
94         }
95
96         this.subfield = function (spec, code) {
97             var f = this.field(spec, true)[0];
98             if (f) return f.subfield(code)
99             return null;
100         }
101
102         this.appendFields = function () {
103             var me = this;
104             Array.prototype.slice.call(arguments).forEach( function (f) { f.position = me.fields.length; me.fields.push( f ) } );
105         }
106
107         this.deleteField = function (f) { return this.deleteFields(f) },
108
109         this.insertOrderedFields = function () {
110             var me = this;
111             for (var i = 0; i < arguments.length; i++) {
112                 var f = arguments[i];
113                 var done = false;
114                 for (var j = 0; j < this.fields.length; j++) {
115                     if (f.tag < this.fields[j].tag) {
116                         this.insertFieldsBefore(this.fields[j], f);
117                         done = true;
118                         break;
119                     }
120                 }
121                 if (!done) this.appendFields(f);
122             }
123         }
124
125         this.insertFieldsBefore = function (target) {
126             var args = Array.prototype.slice.call(arguments);
127             args.splice(0,1);
128             var me = this;
129             for (var j = 0; j < this.fields.length; j++) {
130                 if (target === this.fields[j]) {
131                     args.forEach( function (f) {
132                         f.record = me;
133                         me.fields.splice(j++,0,f);
134                     });
135                     break;
136                 }
137             }
138             for (var j = 0; j < this.fields.length; j++) {
139                 this.fields[j].position = j;
140             }
141         }
142
143         this.insertFieldsAfter = function (target) {
144             var args = Array.prototype.slice.call(arguments);
145             args.splice(0,1);
146             var me = this;
147             for (var j = 0; j < this.fields.length; j++) {
148                 if (target === this.fields[j]) {
149                     args.forEach( function (f) {
150                         f.record = me;
151                         me.fields.splice(++j,0,f);
152                     });
153                     break;
154                 }
155             }
156             for (var j = 0; j < this.fields.length; j++) {
157                 this.fields[j].position = j;
158             }
159         }
160
161         this.deleteFields = function () {
162             var me = this;
163             var counter = 0;
164             for ( var i in arguments ) {
165                 var f = arguments[i];
166                 for (var j = 0; j < me.fields.length; j++) {
167                     if (f === me.fields[j]) {
168                         me.fields[j].record = null;
169                         me.fields.splice(j,1);
170                         counter++
171                         break;
172                     }
173                 }
174             }
175             for (var j = 0; j < this.fields.length; j++) {
176                 this.fields[j].position = j;
177             }
178             return counter;
179         }
180
181         // this.clone = function () { return dojo.clone(this) } // maybe implement later...
182
183         this.fromXmlURL = function (url) {
184             var me = this;
185             return $.get( // This is a Promise
186                 url,
187                 function (mxml) {
188                     me.fromXmlDocument($('record', mxml)[0]);
189                     if (me.onLoad) me.onLoad();
190             });
191         },
192
193         this.fromXmlString = function (mxml) {
194                 this.fromXmlDocument( $( $.parseXML( mxml ) ).find('record')[0] );
195         },
196
197         this.fromXmlDocument = function (mxml) {
198             var me = this;
199             me.leader = $($('leader',mxml)[0]).text() || '00000cam a2200205Ka 4500';
200
201             $('controlfield', mxml).each(function (ind) {
202                 var cf=$(this);
203                 me.fields.push(
204                     new MARC.Field({
205                           record : me,
206                           tag    : cf.attr('tag'),
207                           data   : cf.text(),
208                     })
209                 )
210             });
211
212             $('datafield', mxml).each(function (ind) {
213                 var df=$(this);
214                 me.fields.push(
215                     new MARC.Field({
216                         record    : me,
217                         tag       : df.attr('tag'),
218                         ind1      : df.attr('ind1'),
219                         ind2      : df.attr('ind2'),
220                         subfields : $('subfield', df).map(
221                             function (i, sf) {
222                                 return [[ $(sf).attr('code'), $(sf).text(), i ]];
223                             }
224                         ).get()
225                     })
226                 )
227             });
228
229             for (var j = 0; j < this.fields.length; j++) {
230                 this.fields[j].position = j;
231             }
232
233             me.ready = true;
234
235         },
236
237         this.toXmlDocument = function () {
238
239             var doc = $.parseXML('<record xmlns="http://www.loc.gov/MARC21/slim"/>');
240             var rec_node = $('record', doc)[0];
241
242             var ldr = doc.createElementNS('http://www.loc.gov/MARC21/slim', 'leader');
243             ldr.textContent = this.leader;
244             rec_node.appendChild( ldr );
245
246             this.fields.forEach(function (f) {
247                 var element = f.isControlfield() ? 'controlfield' : 'datafield';
248                 var f_node = doc.createElementNS( 'http://www.loc.gov/MARC21/slim', element );
249                 f_node.setAttribute('tag', f.tag);
250                 
251                 if (f.isControlfield()) {
252                     if (f.data) f_node.textContent = f.data;
253                 } else {
254                     f_node.setAttribute('ind1', f.indicator(1));
255                     f_node.setAttribute('ind2', f.indicator(2));
256                     f.subfields.forEach( function (sf) {
257                         var sf_node = doc.createElementNS('http://www.loc.gov/MARC21/slim', 'subfield');
258                         sf_node.setAttribute('code', sf[0]);
259                         sf_node.textContent = sf[1];
260                         f_node.appendChild(sf_node);
261                     });
262                 }
263
264                 rec_node.appendChild(f_node);
265             });
266
267             return doc;
268         },
269
270         this.toXmlString = function () {
271             return (new XMLSerializer()).serializeToString( this.toXmlDocument() );
272         },
273
274         this.fromBreaker = function (marctxt) {
275             var me = this;
276
277             function cf_line_data (l) { return l.substring(4) || '' };
278             function df_line_data (l) { return l.substring(6) || '' };
279             function line_tag (l) { return l.substring(0,3) };
280             function df_ind1 (l) { return l.substring(4,5).replace('\\',' ') };
281             function df_ind2 (l) { return l.substring(5,6).replace('\\',' ') };
282             function isControlField (l) {
283                 var x = line_tag(l);
284                 return (x == 'LDR' || x < '010') ? true : false;
285             }
286             
287             var lines = marctxt.replace(/^=/gm,'').split('\n');
288             lines.forEach(function (current_line, ind) {
289
290                 if (current_line.match(/^#/)) {
291                     // skip comment lines
292                 } else if (isControlField(current_line)) {
293                     if (line_tag(current_line) == 'LDR') {
294                         me.leader = cf_line_data(current_line) || '00000cam a2200205Ka 4500';
295                     } else {
296                         me.fields.push(
297                             new MARC.Field({
298                                 record : me,
299                                 tag    : line_tag(current_line),
300                                 data   : cf_line_data(current_line).replace('\\',' ','g'),
301                             })
302                         );
303                     }
304                 } else {
305                     if (current_line.substring(4,5) == me.delimiter) // add delimiters if they were left out
306                         current_line = current_line.substring(0,3) + ' \\\\' + current_line.substring(4);
307
308                     var data = df_line_data(current_line);
309                     if (!(data.substring(0,1) == me.delimiter)) data = me.delimiter + 'a' + data;
310
311                     var sf_list = data.split(me.delimiter);
312                     sf_list.shift();
313
314                     me.fields.push(
315                         new MARC.Field({
316                                 record    : me,
317                                 tag       : line_tag(current_line),
318                                 ind1      : df_ind1(current_line),
319                                 ind2      : df_ind2(current_line),
320                                 subfields : sf_list.map( function (sf, i) {
321                                                 var sf_data = sf.substring(1);
322                                                 if (me.delimiter == '$') sf_data = sf_data.replace(/\{dollar\}/g, '$');
323                                                 return [ sf.substring(0,1), sf_data, i ];
324                                             })
325                         })
326                     );
327                 }
328             });
329
330             for (var j = 0; j < this.fields.length; j++) {
331                 this.fields[j].position = j;
332             }
333
334             me.ready = true;
335             return this;
336         },
337
338         this.toBreaker = function () {
339
340             var me = this;
341             var mtxt = '=LDR ' + this.leader + '\n';
342
343             mtxt += this.fields.map( function (f) {
344                 if (f.isControlfield()) {
345                     if (f.data) return '=' + f.tag + ' ' + f.data.replace(' ','\\','g');
346                     return '=' + f.tag;
347                 } else {
348                     return '=' + f.tag + ' ' +
349                         f.indicator(1).replace(' ','\\') + 
350                         f.indicator(2).replace(' ','\\') + 
351                         f.subfields.map( function (sf) {
352                             var sf_data = sf[1];
353                             if (me.delimiter == '$') sf_data = sf_data.replace(/\$/g, '{dollar}');
354                             return me.delimiter + sf[0] + sf_data;
355                         }).join('');
356                 }
357             }).join('\n');
358
359             return mtxt;
360         }
361
362         this.recordType = function () {
363         
364             var _t = this.leader.substr(MARC.Record._ff_pos.Type.ldr.BKS.start, MARC.Record._ff_pos.Type.ldr.BKS.len);
365             var _b = this.leader.substr(MARC.Record._ff_pos.BLvl.ldr.BKS.start, MARC.Record._ff_pos.BLvl.ldr.BKS.len);
366         
367             for (var t in MARC.Record._recType) {
368                 if (_t.match(MARC.Record._recType[t].Type) && _b.match(MARC.Record._recType[t].BLvl)) {
369                     return t;
370                 }
371             }
372             return 'BKS'; // default
373         }
374         
375         this.videorecordingFormatName = function () {
376             var _7 = this.field('007').data;
377         
378             if (_7 && _7.match(/^v/)) {
379                 var _v_e = _7.substr(
380                     MARC.Record._physical_characteristics.v.subfields.e.start,
381                     MARC.Record._physical_characteristics.v.subfields.e.len
382                 );
383         
384                 return MARC.Record._physical_characteristics.v.subfields.e.values[ _v_e ];
385             }
386         
387             return null;
388         }
389         
390         this.videorecordingFormatCode = function () {
391             var _7 = this.field('007').data;
392         
393             if (_7 && _7.match(/^v/)) {
394                 return _7.substr(
395                     MARC.Record._physical_characteristics.v.subfields.e.start,
396                     MARC.Record._physical_characteristics.v.subfields.e.len
397                 );
398             }
399         
400             return null;
401         }
402         
403         this.extractFixedField = function (field, dflt) {
404         if (!MARC.Record._ff_pos[field]) return null;
405         
406             var _l = this.leader;
407             var _8 = this.field('008').data;
408             var _6 = this.field('006').data;
409         
410             var rtype = this.recordType();
411         
412             var val;
413         
414             if (MARC.Record._ff_pos[field].ldr && _l) {
415                 if (MARC.Record._ff_pos[field].ldr[rtype]) {
416                     val = _l.substr(
417                         MARC.Record._ff_pos[field].ldr[rtype].start,
418                         MARC.Record._ff_pos[field].ldr[rtype].len
419                     );
420                 }
421             } else if (MARC.Record._ff_pos[field]._8 && _8) {
422                 if (MARC.Record._ff_pos[field]._8[rtype]) {
423                     val = _8.substr(
424                         MARC.Record._ff_pos[field]._8[rtype].start,
425                         MARC.Record._ff_pos[field]._8[rtype].len
426                     );
427                 }
428             }
429         
430             if (!val && MARC.Record._ff_pos[field]._6 && _6) {
431                 if (MARC.Record._ff_pos[field]._6[rtype]) {
432                     val = _6.substr(
433                         MARC.Record._ff_pos[field]._6[rtype].start,
434                         MARC.Record._ff_pos[field]._6[rtype].len
435                     );
436                 }
437             }
438     
439             if (!val && dflt) {
440                 val = '';
441                 var d;
442                 var p;
443                 if (MARC.Record._ff_pos[field].ldr && MARC.Record._ff_pos[field].ldr[rtype]) {
444                     d = MARC.Record._ff_pos[field].ldr[rtype].def;
445                     p = 'ldr';
446                 }
447     
448                 if (MARC.Record._ff_pos[field]._8 && MARC.Record._ff_pos[field]._8[rtype]) {
449                     d = MARC.Record._ff_pos[field]._8[rtype].def;
450                     p = '_8';
451                 }
452     
453                 if (!val && MARC.Record._ff_pos[field]._6 && MARC.Record._ff_pos[field]._6[rtype]) {
454                     d = MARC.Record._ff_pos[field]._6[rtype].def;
455                     p = '_6';
456                 }
457     
458                 if (p) {
459                     for (var j = 0; j < MARC.Record._ff_pos[field][p][rtype].len; j++) {
460                         val += d;
461                     }
462                 } else {
463                     val = null;
464                 }
465             }
466     
467             return val;
468         }
469     
470         this.setFixedField = function (field, value) {
471             if (!MARC.Record._ff_pos[field]) return null;
472         
473             var _l = this.leader;
474             var _8 = this.field('008').data;
475             var _6 = this.field('006').data;
476         
477             var rtype = this.recordType();
478         
479             var val;
480         
481             if (MARC.Record._ff_pos[field].ldr && _l) {
482                 if (MARC.Record._ff_pos[field].ldr[rtype]) { // It's in the leader
483                     val = value.substr(0, MARC.Record._ff_pos[field].ldr[rtype].len);
484                     this.leader =
485                         _l.substring(0, MARC.Record._ff_pos[field].ldr[rtype].start) +
486                         val +
487                         _l.substring(
488                             MARC.Record._ff_pos[field].ldr[rtype].start
489                             + MARC.Record._ff_pos[field].ldr[rtype].len
490                         );
491                 }
492             } else if (MARC.Record._ff_pos[field]._8 && _8) {
493                 if (MARC.Record._ff_pos[field]._8[rtype]) { // Nope, it's in the 008
494                     val = value.substr(0, MARC.Record._ff_pos[field]._8[rtype].len);
495                     this.field('008').update(
496                         _8.substring(0, MARC.Record._ff_pos[field]._8[rtype].start) +
497                         val +
498                         _8.substring(
499                             MARC.Record._ff_pos[field]._8[rtype].start
500                             + MARC.Record._ff_pos[field]._8[rtype].len
501                         )
502                     );
503                 }
504             }
505         
506             if (!val && MARC.Record._ff_pos[field]._6 && _6) {
507                 if (MARC.Record._ff_pos[field]._6[rtype]) { // ok, maybe the 006?
508                     val = value.substr(0, MARC.Record._ff_pos[field]._6[rtype].len);
509                     this.field('006').update(
510                         _6.substring(0, MARC.Record._ff_pos[field]._6[rtype].start) +
511                         val +
512                         _6.substring(
513                             MARC.Record._ff_pos[field]._6[rtype].start
514                             + MARC.Record._ff_pos[field]._6[rtype].len
515                         )
516                     );
517                 }
518             }
519     
520             return val;
521         }
522
523         this.ready = false;
524         this.fields = [];
525         this.delimiter = '\u2021';
526         this.leader = '00000cam a2200205Ka 4500';
527
528         if (kwargs.delimiter) this.delimiter = kwargs.delimiter;
529         if (kwargs.onLoad) this.onLoad = kwargs.onLoad;
530
531         if (kwargs.url) {
532             this.fromXmlURL(kwargs.url);
533         } else if (kwargs.marcxml) {
534             this.fromXmlString(kwargs.marcxml);
535             if (this.onLoad) this.onLoad();
536         } else if (kwargs.xml) {
537             this.fromXmlDocument(kwargs.xml);
538             if (this.onLoad) this.onLoad();
539         } else if (kwargs.marcbreaker) {
540             this.fromBreaker(kwargs.marcbreaker);
541             if (this.onLoad) this.onLoad();
542         }
543
544         if (kwargs.rtype == 'AUT') {
545             this.setFixedField('Type','z');
546         }
547
548     },
549
550     Field : function (kwargs) {
551         if (!kwargs) kwargs = {};
552
553         this.subfield = function (code, wantarray) {
554             var list = this.subfields.filter( function (s) {
555                 if (s[0] == code) return true; return false;
556             });
557             if (!wantarray && list.length == 1) return list[0];
558             return list;
559         }
560
561         this.addSubfields = function () {
562             for (var i = 0; i < arguments.length; i++) {
563                 var code = arguments[i];
564                 var value = arguments[++i];
565                 this.subfields.push( [ code, value ] );
566             }
567         }
568
569         this.deleteExactSubfields = function () {
570             var me = this;
571             var counter = 0;
572             var done = false;
573             for ( var i in arguments ) {
574                 var f = arguments[i];
575                 for (var j = 0; j < me.subfields.length; j++) {
576                     if (f === me.subfields[j]) {
577                         me.subfields.splice(j,1);
578                         counter++
579                         j++;
580                         done = true;
581                     }
582                     if (done && me.subfields[j])
583                         me.subfields[j][2] -= 1;
584                 }
585             }
586             return counter;
587         }
588
589
590         this.deleteSubfields = function (c) {
591             return this.deleteSubfield( { code : c } );
592         }
593
594         this.deleteSubfield = function (args) {
595             var me = this;
596             if (!Array.isArray( args.code )) {
597                 args.code = [ args.code ];
598             }
599
600             if (args.pos && !Array.isArray( args.pos )) {
601                 args.pos = [ args.pos ];
602             }
603
604             for (var i = 0; i < args.code.length; i++) {
605                 var sub_pos = {};
606                 for (var j = 0; j < me.subfields; j++) {
607                     if (me.subfields[j][0] == args.code[i]) {
608
609                         if (!sub_pos[args.code[i]]) sub_pos[args.code[j]] = 0;
610                         else sub_pos[args.code[i]]++;
611
612                         if (args.pos) {
613                             for (var k = 0; k < args.pos.length; k++) {
614                                 if (sub_pos[args.code[i]] == args.pos[k]) me.subfields.splice(j,1);
615                             }
616                         } else if (args.match && me.subfields[j][1].match( args.match )) {
617                             me.subfields.splice(j,1);
618                         } else {
619                             me.subfields.splice(j,1);
620                         }
621                     }
622                 }
623             }
624         }
625
626         this.update = function ( args ) {
627             if (this.isControlfield()) {
628                 this.data = args;
629             } else {
630                 if (args.ind1) this.ind1 = args.ind1;
631                 if (args.ind2) this.ind2 = args.ind2;
632                 if (args.tag) this.tag = args.tag;
633
634                 for (var i in args) {
635                     if (i == 'tag' || i == 'ind1' || i == 'ind2') continue;
636                     var done = 0;
637                     this.subfields.forEach( function (f) {
638                         if (!done && f[0] == i) {
639                             f[1] = args[i];
640                             done = 1;
641                         }
642                     });
643                 }
644             }
645         }
646
647         this.isControlfield = function () {
648             return this.tag < '010' ? true : false;
649         }
650
651         this.indicator = function (num, value) {
652             if (value !== undefined) {
653                 if (num == 1) this.ind1 = value;
654                 else if (num == 2) this.ind2 = value;
655                 else { this.error = true; return null; }
656             }
657             if (num == 1) return this.ind1;
658             else if (num == 2) return this.ind2;
659             else { this.error = true; return null; }
660         }
661
662         this.error = false; 
663         this.record = null; // MARC record pointer
664         this.tag = ''; // MARC tag
665         this.ind1 = ' '; // MARC indicator 1
666         this.ind2 = ' '; // MARC indicator 2
667         this.data = ''; // MARC data for a controlfield element
668         this.subfields = []; // list of MARC subfields for a datafield element
669
670         this.position = kwargs.position;
671         this.record = kwargs.record;
672         this.tag = kwargs.tag;
673         this.ind1 = kwargs.ind1 || ' ';
674         this.ind2 = kwargs.ind2 || ' ';
675         this.data = kwargs.data;
676
677         if (kwargs.subfields) this.subfields = kwargs.subfields;
678         else this.subfields = [];
679
680     },
681
682     Batch : function(kwargs) {
683
684         this.parse = function () {
685             if (this.source instanceof Object ) { // assume an xml collection document
686                 this.source = $('record', this.source);
687                 this.type = 'xml';
688             } else if (this.source.match(/^\s*</)) { // this is xml text
689                 this.source = $.parseXML( mxml ).find('record');
690                 this.type = 'xml';
691             } else { // must be a marcbreaker doc. split on blank lines
692                 this.source = this.source.split(/^$/);
693                 this.type = 'marcbreaker';
694             }
695         }
696
697         this.fetchURL = function (u) {
698             var me = this;
699             $.get( u, function (mrc) {
700                 me.source = mrc;
701                 me.ready = true;
702             });
703         }
704
705         this.next = function () {
706             var chunk = this.source[this.current_record++];
707
708             if (chunk) {
709                 var args = {};
710                 args[this.type] = chunk;
711                 if (this.delimiter) args.delimiter = this.delimiter;
712                 return new MARC.Record(args);
713             }
714
715             return null;
716         }
717
718         this.ready = false;
719         this.records = [];
720         this.source = kwargs.source;
721         this.delimiter = kwargs.delimiter
722         this.current_record = 0;
723
724         if (this.source) this.ready = true;
725         if (!this.ready && kwargs.url) this.fetchURL( kwargs.url );
726
727         if (this.ready) this.parse();
728
729     }
730 };
731
732 MARC.Record._recType = {
733     BKS : { Type : /[at]{1}/,    BLvl : /[acdm]{1}/ },
734     SER : { Type : /[a]{1}/,    BLvl : /[bsi]{1}/ },
735     VIS : { Type : /[gkro]{1}/,    BLvl : /[abcdmsi]{1}/ },
736     MIX : { Type : /[p]{1}/,    BLvl : /[cdi]{1}/ },
737     MAP : { Type : /[ef]{1}/,    BLvl : /[abcdmsi]{1}/ },
738     SCO : { Type : /[cd]{1}/,    BLvl : /[abcdmsi]{1}/ },
739     REC : { Type : /[ij]{1}/,    BLvl : /[abcdmsi]{1}/ },
740     COM : { Type : /[m]{1}/,    BLvl : /[abcdmsi]{1}/ },
741     AUT : { Type : /[z]{1}/,    BLvl : /.{1}/ },
742     MFHD : { Type : /[uvxy]{1}/,  BLvl : /.{1}/ }
743 };
744
745 MARC.Record._ff_pos = {
746     AccM : {
747         _8 : {
748             SCO : {start: 24, len : 6, def : ' ' },
749             REC : {start: 24, len : 6, def : ' ' }
750         },
751         _6 : {
752             SCO : {start: 7, len : 6, def : ' ' },
753             REC : {start: 7, len : 6, def : ' ' }
754         }
755     },
756     Alph : {
757         _8 : {
758             SER : {start : 33, len : 1, def : ' ' }
759         },
760         _6 : {
761             SER : {start : 16, len : 1, def : ' ' }
762         }
763     },
764     Audn : {
765         _8 : {
766             BKS : {start : 22, len : 1, def : ' ' },
767             SER : {start : 22, len : 1, def : ' ' },
768             VIS : {start : 22, len : 1, def : ' ' },
769             SCO : {start : 22, len : 1, def : ' ' },
770             REC : {start : 22, len : 1, def : ' ' },
771             COM : {start : 22, len : 1, def : ' ' }
772         },
773         _6 : {
774             BKS : {start : 5, len : 1, def : ' ' },
775             SER : {start : 5, len : 1, def : ' ' },
776             VIS : {start : 5, len : 1, def : ' ' },
777             SCO : {start : 5, len : 1, def : ' ' },
778             REC : {start : 5, len : 1, def : ' ' },
779             COM : {start : 5, len : 1, def : ' ' }
780         }
781     },
782     Biog : {
783         _8 : {
784             BKS : {start : 34, len : 1, def : ' ' }
785         },
786         _6 : {
787             BKS : {start : 17, len : 1, def : ' ' }
788         }
789     },
790     BLvl : {
791         ldr : {
792             BKS : {start : 7, len : 1, def : 'm' },
793             SER : {start : 7, len : 1, def : 's' },
794             VIS : {start : 7, len : 1, def : 'm' },
795             MIX : {start : 7, len : 1, def : 'c' },
796             MAP : {start : 7, len : 1, def : 'm' },
797             SCO : {start : 7, len : 1, def : 'm' },
798             REC : {start : 7, len : 1, def : 'm' },
799             COM : {start : 7, len : 1, def : 'm' }
800         }
801     },
802     Comp : {
803         _8 : {
804             SCO : {start : 18, len : 2, def : 'uu'},
805             REC : {start : 18, len : 2, def : 'uu'}
806         },
807         _6 : {
808             SCO : {start : 1, len : 2, def : 'uu'},
809             REC : {start : 1, len : 2, def : 'uu'}
810         },
811     },
812     Conf : {
813         _8 : {
814             BKS : {start : 29, len : 1, def : '0' },
815             SER : {start : 29, len : 1, def : '0' }
816         },
817         _6 : {
818             BKS : {start : 11, len : 1, def : '0' },
819             SER : {start : 11, len : 1, def : '0' }
820         }
821     },
822     Cont : {
823         _8 : {
824             BKS : {start : 24, len : 4, def : ' ' },
825             SER : {start : 25, len : 3, def : ' ' }
826         },
827         _6 : {
828             BKS : {start : 7, len : 4, def : ' ' },
829             SER : {start : 8, len : 3, def : ' ' }
830         }
831     },
832     CrTp : {
833         _8 : {
834             MAP : {start: 25, len : 1, def : 'a' }
835         },
836         _6 : { 
837             MAP : {start : 8, len : 1, def : 'a' }
838         }
839     },
840     Ctrl : {
841         ldr : {
842             BKS : {start : 8, len : 1, def : ' ' },
843             SER : {start : 8, len : 1, def : ' ' },
844             VIS : {start : 8, len : 1, def : ' ' },
845             MIX : {start : 8, len : 1, def : ' ' },
846             MAP : {start : 8, len : 1, def : ' ' },
847             SCO : {start : 8, len : 1, def : ' ' },
848             REC : {start : 8, len : 1, def : ' ' },
849             COM : {start : 8, len : 1, def : ' ' }
850         }
851     },
852     Ctry : {
853             _8 : {
854                 BKS : {start : 15, len : 3, def : ' ' },
855                 SER : {start : 15, len : 3, def : ' ' },
856                 VIS : {start : 15, len : 3, def : ' ' },
857                 MIX : {start : 15, len : 3, def : ' ' },
858                 MAP : {start : 15, len : 3, def : ' ' },
859                 SCO : {start : 15, len : 3, def : ' ' },
860                 REC : {start : 15, len : 3, def : ' ' },
861                 COM : {start : 15, len : 3, def : ' ' }
862             }
863         },
864     Date1 : {
865         _8 : {
866             BKS : {start : 7, len : 4, def : ' ' },
867             SER : {start : 7, len : 4, def : ' ' },
868             VIS : {start : 7, len : 4, def : ' ' },
869             MIX : {start : 7, len : 4, def : ' ' },
870             MAP : {start : 7, len : 4, def : ' ' },
871             SCO : {start : 7, len : 4, def : ' ' },
872             REC : {start : 7, len : 4, def : ' ' },
873             COM : {start : 7, len : 4, def : ' ' }
874         }
875     },
876     Date2 : {
877         _8 : {
878             BKS : {start : 11, len : 4, def : ' ' },
879             SER : {start : 11, len : 4, def : '9' },
880             VIS : {start : 11, len : 4, def : ' ' },
881             MIX : {start : 11, len : 4, def : ' ' },
882             MAP : {start : 11, len : 4, def : ' ' },
883             SCO : {start : 11, len : 4, def : ' ' },
884             REC : {start : 11, len : 4, def : ' ' },
885             COM : {start : 11, len : 4, def : ' ' }
886         }
887     },
888     Desc : {
889         ldr : {
890             BKS : {start : 18, len : 1, def : ' ' },
891             SER : {start : 18, len : 1, def : ' ' },
892             VIS : {start : 18, len : 1, def : ' ' },
893             MIX : {start : 18, len : 1, def : ' ' },
894             MAP : {start : 18, len : 1, def : ' ' },
895             SCO : {start : 18, len : 1, def : ' ' },
896             REC : {start : 18, len : 1, def : ' ' },
897             COM : {start : 18, len : 1, def : ' ' }
898         }
899     },
900     DtSt : {
901         _8 : {
902             BKS : {start : 6, len : 1, def : ' ' },
903             SER : {start : 6, len : 1, def : 'c' },
904             VIS : {start : 6, len : 1, def : ' ' },
905             MIX : {start : 6, len : 1, def : ' ' },
906             MAP : {start : 6, len : 1, def : ' ' },
907             SCO : {start : 6, len : 1, def : ' ' },
908             REC : {start : 6, len : 1, def : ' ' },
909             COM : {start : 6, len : 1, def : ' ' }
910         }
911     },
912     ELvl : {
913         ldr : {
914             BKS : {start : 17, len : 1, def : ' ' },
915             SER : {start : 17, len : 1, def : ' ' },
916             VIS : {start : 17, len : 1, def : ' ' },
917             MIX : {start : 17, len : 1, def : ' ' },
918             MAP : {start : 17, len : 1, def : ' ' },
919             SCO : {start : 17, len : 1, def : ' ' },
920             REC : {start : 17, len : 1, def : ' ' },
921             COM : {start : 17, len : 1, def : ' ' },
922             AUT : {start : 17, len : 1, def : 'n' },
923             MFHD : {start : 17, len : 1, def : 'u' }
924         }
925     },
926     EntW : {
927         _8 : {
928             SER : {start : 24, len : 1, def : ' '}
929         },
930         _6 : {
931             SER : {start : 7, len : 1, def : ' '}
932         }
933     },
934     Fest : {
935         _8 : {
936             BKS : {start : 30, len : 1, def : '0' }
937         },
938         _6 : {
939             BKS : {start : 13, len : 1, def : '0' }
940         }
941     },
942     File : {
943         _8 : {
944             COM : {start: 26, len : 1, def : 'u' }
945         },
946         _6 : {
947             COM : {start: 9, len : 1, def : 'u' }
948         }
949     },
950     FMus : {
951         _8 : {
952             SCO : {start : 20, len : 1, def : 'u'},
953             REC : {start : 20, len : 1, def : 'n'}
954         },
955         _6 : {
956             SCO : {start : 3, len : 1, def : 'u'},
957             REC : {start : 3, len : 1, def : 'n'}
958         },
959     },
960     Form : {
961         _8 : {
962             BKS : {start : 23, len : 1, def : ' ' },
963             SER : {start : 23, len : 1, def : ' ' },
964             VIS : {start : 29, len : 1, def : ' ' },
965             MIX : {start : 23, len : 1, def : ' ' },
966             MAP : {start : 29, len : 1, def : ' ' },
967             SCO : {start : 23, len : 1, def : ' ' },
968             REC : {start : 23, len : 1, def : ' ' }
969         },
970         _6 : {
971             BKS : {start : 6, len : 1, def : ' ' },
972             SER : {start : 6, len : 1, def : ' ' },
973             VIS : {start : 12, len : 1, def : ' ' },
974             MIX : {start : 6, len : 1, def : ' ' },
975             MAP : {start : 12, len : 1, def : ' ' },
976             SCO : {start : 6, len : 1, def : ' ' },
977             REC : {start : 6, len : 1, def : ' ' }
978         }
979     },
980     Freq : {
981         _8 : {
982             SER : {start : 18, len : 1, def : ' '}
983         },
984         _6 : {
985             SER : {start : 1, len : 1, def : ' '}
986         }
987     },
988     GPub : {
989         _8 : {
990             BKS : {start : 28, len : 1, def : ' ' },
991             SER : {start : 28, len : 1, def : ' ' },
992             VIS : {start : 28, len : 1, def : ' ' },
993             MAP : {start : 28, len : 1, def : ' ' },
994             COM : {start : 28, len : 1, def : ' ' }
995         },
996         _6 : {
997             BKS : {start : 11, len : 1, def : ' ' },
998             SER : {start : 11, len : 1, def : ' ' },
999             VIS : {start : 11, len : 1, def : ' ' },
1000             MAP : {start : 11, len : 1, def : ' ' },
1001             COM : {start : 11, len : 1, def : ' ' }
1002         }
1003     },
1004     Ills : {
1005         _8 : {
1006             BKS : {start : 18, len : 4, def : ' ' }
1007         },
1008         _6 : {
1009             BKS : {start : 1, len : 4, def : ' ' }
1010         }
1011     },
1012     Indx : {
1013         _8 : {
1014             BKS : {start : 31, len : 1, def : '0' },
1015             MAP : {start : 31, len : 1, def : '0' }
1016         },
1017         _6 : {
1018             BKS : {start : 14, len : 1, def : '0' },
1019             MAP : {start : 14, len : 1, def : '0' }
1020         }
1021     },
1022     Item : {
1023         ldr : {
1024             MFHD : {start : 18, len : 1, def : 'i' }
1025         }
1026     },
1027     Lang : {
1028         _8 : {
1029             BKS : {start : 35, len : 3, def : ' ' },
1030             SER : {start : 35, len : 3, def : ' ' },
1031             VIS : {start : 35, len : 3, def : ' ' },
1032             MIX : {start : 35, len : 3, def : ' ' },
1033             MAP : {start : 35, len : 3, def : ' ' },
1034             SCO : {start : 35, len : 3, def : ' ' },
1035             REC : {start : 35, len : 3, def : ' ' },
1036             COM : {start : 35, len : 3, def : ' ' }
1037         }
1038     },
1039     LitF : {
1040         _8 : {
1041             BKS : {start : 33, len : 1, def : '0' }
1042         },
1043         _6 : {
1044             BKS : {start : 16, len : 1, def : '0' }
1045         }
1046     },
1047     LTxt : {
1048         _8 : {
1049             SCO : {start : 30, len : 2, def : 'n'},
1050             REC : {start : 30, len : 2, def : ' '}
1051         },
1052         _6 : {
1053             SCO : {start : 13, len : 2, def : 'n'},
1054             REC : {start : 13, len : 2, def : ' '}
1055         },
1056     },
1057     MRec : {
1058         _8 : {
1059             BKS : {start : 38, len : 1, def : ' ' },
1060             SER : {start : 38, len : 1, def : ' ' },
1061             VIS : {start : 38, len : 1, def : ' ' },
1062             MIX : {start : 38, len : 1, def : ' ' },
1063             MAP : {start : 38, len : 1, def : ' ' },
1064             SCO : {start : 38, len : 1, def : ' ' },
1065             REC : {start : 38, len : 1, def : ' ' },
1066             COM : {start : 38, len : 1, def : ' ' }
1067         }
1068     },
1069     Orig : {
1070         _8 : {
1071             SER : {start : 22, len : 1, def : ' '}
1072         },
1073         _6 : {
1074             SER : {start: 5, len : 1, def: ' '}
1075         }
1076     },
1077     Part : {
1078         _8 : {
1079             SCO : {start : 21, len : 1, def : ' '},
1080             REC : {start : 21, len : 1, def : 'n'}
1081         },
1082         _6 : {
1083             SCO : {start : 4, len : 1, def : ' '},
1084             REC : {start : 4, len : 1, def : 'n'}
1085         },
1086     },
1087     Proj : {
1088         _8 : {
1089             MAP : {start : 22, len : 2, def : ' ' }
1090         },
1091         _6 : {
1092             MAP: {start : 5, len : 2, def : ' ' }
1093         }
1094     },
1095     RecStat : {
1096         ldr : {
1097             BKS : {start : 5, len : 1, def : 'n' },
1098             SER : {start : 5, len : 1, def : 'n' },
1099             VIS : {start : 5, len : 1, def : 'n' },
1100             MIX : {start : 5, len : 1, def : 'n' },
1101             MAP : {start : 5, len : 1, def : 'n' },
1102             SCO : {start : 5, len : 1, def : 'n' },
1103             REC : {start : 5, len : 1, def : 'n' },
1104             COM : {start : 5, len : 1, def : 'n' },
1105             MFHD: {start : 5, len : 1, def : 'n' },
1106             AUT : {start : 5, len : 1, def : 'n' }
1107         }
1108     },
1109     Regl : {
1110         _8 : {
1111             SER : {start : 19, len : 1, def : ' '}
1112         },
1113         _6 : {
1114             SER : {start : 2, len : 1, def : ' '}
1115         }
1116     },
1117     Relf : {
1118         _8 : {
1119             MAP : {start: 18, len : 4, def : ' '}
1120         },
1121         _6 : {
1122             MAP : {start: 1, len : 4, def : ' '}
1123         }
1124     },
1125     'S/L' : {
1126         _8 : {
1127             SER : {start : 34, len : 1, def : '0' }
1128         },
1129         _6 : {
1130             SER : {start : 17, len : 1, def : '0' }
1131         }
1132     },
1133     SpFM : {
1134         _8 : {
1135             MAP : {start: 33, len : 2, def : ' ' }
1136         },
1137         _6 : {
1138             MAP : {start: 16, len : 2, def : ' '}
1139         }
1140     },
1141     Srce : {
1142         _8 : {
1143             BKS : {start : 39, len : 1, def : 'd' },
1144             SER : {start : 39, len : 1, def : 'd' },
1145             VIS : {start : 39, len : 1, def : 'd' },
1146             SCO : {start : 39, len : 1, def : 'd' },
1147             REC : {start : 39, len : 1, def : 'd' },
1148             COM : {start : 39, len : 1, def : 'd' },
1149             MFHD : {start : 39, len : 1, def : 'd' },
1150             "AUT" : {"start" : 39, "len" : 1, "def" : 'd' }
1151         }
1152     },
1153     SrTp : {
1154         _8 : {
1155             SER : {start : 21, len : 1, def : ' '}
1156         },
1157         _6 : {
1158             SER : {start : 4, len : 1, def : ' '}
1159         }
1160     },
1161     Tech : {
1162         _8 : {
1163             VIS : {start : 34, len : 1, def : ' '}
1164         },
1165         _6 : {
1166             VIS : {start : 17, len : 1, def : ' '}
1167         }
1168     },
1169     Time : {
1170         _8 : {
1171             VIS : {start : 18, len : 3, def : ' '}
1172         },
1173         _6 : {
1174             VIS : {start : 1, len : 3, def : ' '}
1175         }
1176     },
1177     TMat : {
1178         _8 : {
1179             VIS : {start : 33, len : 1, def : ' ' }
1180         },
1181         _6 : {
1182             VIS : {start : 16, len : 1, def : ' ' }
1183         }
1184     },
1185     TrAr : {
1186         _8 : {
1187             SCO : {start : 33, len : 1, def : ' ' },
1188             REC : {start : 33, len : 1, def : 'n' }
1189         },
1190         _6 : {
1191             SCO : {start : 16, len : 1, def : ' ' },
1192             REC : {start : 16, len : 1, def : 'n' }
1193         }
1194     },
1195     Type : {
1196         ldr : {
1197             BKS : {start : 6, len : 1, def : 'a' },
1198             SER : {start : 6, len : 1, def : 'a' },
1199             VIS : {start : 6, len : 1, def : 'g' },
1200             MIX : {start : 6, len : 1, def : 'p' },
1201             MAP : {start : 6, len : 1, def : 'e' },
1202             SCO : {start : 6, len : 1, def : 'c' },
1203             REC : {start : 6, len : 1, def : 'i' },
1204             COM : {start : 6, len : 1, def : 'm' },
1205             AUT : {start : 6, len : 1, def : 'z' },
1206             MFHD : {start : 6, len : 1, def : 'y' }
1207         }
1208     },
1209     "GeoDiv" : {
1210          "_8" : {
1211              "AUT" : {"start" : 6, "len" : 1, "def" : ' ' }
1212          }
1213      },
1214      "Roman" : {
1215          "_8" : {
1216              "AUT" : {"start" : 7, "len" : 1, "def" : ' ' }
1217          }
1218      },
1219      "CatLang" : {
1220          "_8" : {
1221              "AUT" : {"start" : 8, "len" : 1, "def" : ' ' }
1222          }
1223      },
1224      "Kind" : {
1225          "_8" : {
1226              "AUT" : {"start" : 9, "len" : 1, "def" : ' ' }
1227          }
1228      },
1229      "Rules" : {
1230          "_8" : {
1231              "AUT" : {"start" : 10, "len" : 1, "def" : ' ' }
1232          }
1233      },
1234      "Subj" : {
1235          "_8" : {
1236              "AUT" : {"start" : 11, "len" : 1, "def" : ' ' }
1237          }
1238      },
1239      "Series" : {
1240          "_8" : {
1241              "AUT" : {"start" : 12, "len" : 1, "def" : ' ' }
1242          }
1243      },
1244      "SerNum" : {
1245          "_8" : {
1246              "AUT" : {"start" : 13, "len" : 1, "def" : ' ' }
1247          }
1248      },
1249      "NameUse" : {
1250          "_8" : {
1251              "AUT" : {"start" : 14, "len" : 1, "def" : ' ' }
1252          }
1253      },
1254      "SubjUse" : {
1255          "_8" : {
1256              "AUT" : {"start" : 15, "len" : 1, "def" : ' ' }
1257          }
1258      },
1259      "SerUse" : {
1260          "_8" : {
1261              "AUT" : {"start" : 16, "len" : 1, "def" : ' ' }
1262          }
1263      },
1264      "TypeSubd" : {
1265          "_8" : {
1266              "AUT" : {"start" : 17, "len" : 1, "def" : ' ' }
1267          }
1268      },
1269      "GovtAgn" : {
1270          "_8" : {
1271              "AUT" : {"start" : 28, "len" : 1, "def" : ' ' }
1272          }
1273      },
1274      "RefStatus" : {
1275          "_8" : {
1276              "AUT" : {"start" : 29, "len" : 1, "def" : ' ' }
1277          }
1278      },
1279      "UpdStatus" : {
1280          "_8" : {
1281              "AUT" : {"start" : 31, "len" : 1, "def" : ' ' }
1282          }
1283      },
1284      "Name" : {
1285          "_8" : {
1286              "AUT" : {"start" : 32, "len" : 1, "def" : ' ' }
1287          }
1288      },
1289      "Status" : {
1290          "_8" : {
1291              "AUT" : {"start" : 33, "len" : 1, "def" : ' ' }
1292          }
1293      },
1294      "ModRec" : {
1295          "_8" : {
1296              "AUT" : {"start" : 38, "len" : 1, "def" : ' ' }
1297          }
1298      },
1299      "Source" : {
1300          "_8" : {
1301              "AUT" : {"start" : 39, "len" : 1, "def" : ' ' }
1302          }
1303      }
1304 };
1305
1306 MARC.Record._physical_characteristics = {
1307     c : {
1308         label     : "Electronic Resource",
1309         subfields : {
1310             b : {    start : 1,
1311                 len   : 1,
1312                 label : "SMD",
1313                 values: {    a : "Tape Cartridge",
1314                         b : "Chip cartridge",
1315                         c : "Computer optical disk cartridge",
1316                         f : "Tape cassette",
1317                         h : "Tape reel",
1318                         j : "Magnetic disk",
1319                         m : "Magneto-optical disk",
1320                         o : "Optical disk",
1321                         r : "Remote",
1322                         u : "Unspecified",
1323                         z : "Other"
1324                 }
1325             },
1326             d : {    start : 3,
1327                 len   : 1,
1328                 label : "Color",
1329                 values: {    a : "One color",
1330                         b : "Black-and-white",
1331                         c : "Multicolored",
1332                         g : "Gray scale",
1333                         m : "Mixed",
1334                         n : "Not applicable",
1335                         u : "Unknown",
1336                         z : "Other"
1337                 }
1338             },
1339             e : {    start : 4,
1340                 len   : 1,
1341                 label : "Dimensions",
1342                 values: {    a : "3 1/2 in.",
1343                         e : "12 in.",
1344                         g : "4 3/4 in. or 12 cm.",
1345                         i : "1 1/8 x 2 3/8 in.",
1346                         j : "3 7/8 x 2 1/2 in.",
1347                         n : "Not applicable",
1348                         o : "5 1/4 in.",
1349                         u : "Unknown",
1350                         v : "8 in.",
1351                         z : "Other"
1352                 }
1353             },
1354             f : {    start : 5,
1355                 len   : 1,
1356                 label : "Sound",
1357                 values: {    ' ' : "No sound (Silent)",
1358                         a   : "Sound",
1359                         u   : "Unknown"
1360                 }
1361             },
1362             g : {    start : 6,
1363                 len   : 3,
1364                 label : "Image bit depth",
1365                 values: {    mmm   : "Multiple",
1366                         nnn   : "Not applicable",
1367                         '---' : "Unknown"
1368                 }
1369             },
1370             h : {    start : 9,
1371                 len   : 1,
1372                 label : "File formats",
1373                 values: {    a : "One file format",
1374                         m : "Multiple file formats",
1375                         u : "Unknown"
1376                 }
1377             },
1378             i : {    start : 10,
1379                 len   : 1,
1380                 label : "Quality assurance target(s)",
1381                 values: {    a : "Absent",
1382                         n : "Not applicable",
1383                         p : "Present",
1384                         u : "Unknown"
1385                 }
1386             },
1387             j : {    start : 11,
1388                 len   : 1,
1389                 label : "Antecedent/Source",
1390                 values: {    a : "File reproduced from original",
1391                         b : "File reproduced from microform",
1392                         c : "File reproduced from electronic resource",
1393                         d : "File reproduced from an intermediate (not microform)",
1394                         m : "Mixed",
1395                         n : "Not applicable",
1396                         u : "Unknown"
1397                 }
1398             },
1399             k : {    start : 12,
1400                 len   : 1,
1401                 label : "Level of compression",
1402                 values: {    a : "Uncompressed",
1403                         b : "Lossless",
1404                         d : "Lossy",
1405                         m : "Mixed",
1406                         u : "Unknown"
1407                 }
1408             },
1409             l : {    start : 13,
1410                 len   : 1,
1411                 label : "Reformatting quality",
1412                 values: {    a : "Access",
1413                         n : "Not applicable",
1414                         p : "Preservation",
1415                         r : "Replacement",
1416                         u : "Unknown"
1417                 }
1418             }
1419         }
1420     },
1421     d : {
1422         label     : "Globe",
1423         subfields : {
1424             b : {    start : 1,
1425                 len   : 1,
1426                 label : "SMD",
1427                 values: {    a : "Celestial globe",
1428                         b : "Planetary or lunar globe",
1429                         c : "Terrestrial globe",
1430                         e : "Earth moon globe",
1431                         u : "Unspecified",
1432                         z : "Other"
1433                 }
1434             },
1435             d : {    start : 3,
1436                 len   : 1,
1437                 label : "Color",
1438                 values: {    a : "One color",
1439                         c : "Multicolored"
1440                 }
1441             },
1442             e : {    start : 4,
1443                 len   : 1,
1444                 label : "Physical medium",
1445                 values: {    a : "Paper",
1446                         b : "Wood",
1447                         c : "Stone",
1448                         d : "Metal",
1449                         e : "Synthetics",
1450                         f : "Skins",
1451                         g : "Textile",
1452                         p : "Plaster",
1453                         u : "Unknown",
1454                         z : "Other"
1455                 }
1456             },
1457             f : {    start : 5,
1458                 len   : 1,
1459                 label : "Type of reproduction",
1460                 values: {    f : "Facsimile",
1461                         n : "Not applicable",
1462                         u : "Unknown",
1463                         z : "Other"
1464                 }
1465             }
1466         }
1467     },
1468     a : {
1469         label     : "Map",
1470         subfields : {
1471             b : {    start : 1,
1472                 len   : 1,
1473                 label : "SMD",
1474                 values: {    d : "Atlas",
1475                         g : "Diagram",
1476                         j : "Map",
1477                         k : "Profile",
1478                         q : "Model",
1479                         r : "Remote-sensing image",
1480                         s : "Section",
1481                         u : "Unspecified",
1482                         y : "View",
1483                         z : "Other"
1484                 }
1485             },
1486             d : {    start : 3,
1487                 len   : 1,
1488                 label : "Color",
1489                 values: {    a : "One color",
1490                         c : "Multicolored"
1491                 }
1492             },
1493             e : {    start : 4,
1494                 len   : 1,
1495                 label : "Physical medium",
1496                 values: {    a : "Paper",
1497                         b : "Wood",
1498                         c : "Stone",
1499                         d : "Metal",
1500                         e : "Synthetics",
1501                         f : "Skins",
1502                         g : "Textile",
1503                         p : "Plaster",
1504                         q : "Flexible base photographic medium, positive",
1505                         r : "Flexible base photographic medium, negative",
1506                         s : "Non-flexible base photographic medium, positive",
1507                         t : "Non-flexible base photographic medium, negative",
1508                         u : "Unknown",
1509                         y : "Other photographic medium",
1510                         z : "Other"
1511                 }
1512             },
1513             f : {    start : 5,
1514                 len   : 1,
1515                 label : "Type of reproduction",
1516                 values: {    f : "Facsimile",
1517                         n : "Not applicable",
1518                         u : "Unknown",
1519                         z : "Other"
1520                 }
1521             },
1522             g : {    start : 6,
1523                 len   : 1,
1524                 label : "Production/reproduction details",
1525                 values: {    a : "Photocopy, blueline print",
1526                         b : "Photocopy",
1527                         c : "Pre-production",
1528                         d : "Film",
1529                         u : "Unknown",
1530                         z : "Other"
1531                 }
1532             },
1533             h : {    start : 7,
1534                 len   : 1,
1535                 label : "Positive/negative",
1536                 values: {    a : "Positive",
1537                         b : "Negative",
1538                         m : "Mixed",
1539                         n : "Not applicable"
1540                 }
1541             }
1542         }
1543     },
1544     h : {
1545         label     : "Microform",
1546         subfields : {
1547             b : {    start : 1,
1548                 len   : 1,
1549                 label : "SMD",
1550                 values: {    a : "Aperture card",
1551                         b : "Microfilm cartridge",
1552                         c : "Microfilm cassette",
1553                         d : "Microfilm reel",
1554                         e : "Microfiche",
1555                         f : "Microfiche cassette",
1556                         g : "Microopaque",
1557                         u : "Unspecified",
1558                         z : "Other"
1559                 }
1560             },
1561             d : {    start : 3,
1562                 len   : 1,
1563                 label : "Positive/negative",
1564                 values: {    a : "Positive",
1565                         b : "Negative",
1566                         m : "Mixed",
1567                         u : "Unknown"
1568                 }
1569             },
1570             e : {    start : 4,
1571                 len   : 1,
1572                 label : "Dimensions",
1573                 values: {    a : "8 mm.",
1574                         e : "16 mm.",
1575                         f : "35 mm.",
1576                         g : "70mm.",
1577                         h : "105 mm.",
1578                         l : "3 x 5 in. (8 x 13 cm.)",
1579                         m : "4 x 6 in. (11 x 15 cm.)",
1580                         o : "6 x 9 in. (16 x 23 cm.)",
1581                         p : "3 1/4 x 7 3/8 in. (9 x 19 cm.)",
1582                         u : "Unknown",
1583                         z : "Other"
1584                 }
1585             },
1586             f : {    start : 5,
1587                 len   : 4,
1588                 label : "Reduction ratio range/Reduction ratio",
1589                 values: {    a : "Low (1-16x)",
1590                         b : "Normal (16-30x)",
1591                         c : "High (31-60x)",
1592                         d : "Very high (61-90x)",
1593                         e : "Ultra (90x-)",
1594                         u : "Unknown",
1595                         v : "Reduction ratio varies"
1596                 }
1597             },
1598             g : {    start : 9,
1599                 len   : 1,
1600                 label : "Color",
1601                 values: {    b : "Black-and-white",
1602                         c : "Multicolored",
1603                         m : "Mixed",
1604                         u : "Unknown",
1605                         z : "Other"
1606                 }
1607             },
1608             h : {    start : 10,
1609                 len   : 1,
1610                 label : "Emulsion on film",
1611                 values: {    a : "Silver halide",
1612                         b : "Diazo",
1613                         c : "Vesicular",
1614                         m : "Mixed",
1615                         n : "Not applicable",
1616                         u : "Unknown",
1617                         z : "Other"
1618                 }
1619             },
1620             i : {    start : 11,
1621                 len   : 1,
1622                 label : "Quality assurance target(s)",
1623                 values: {    a : "1st gen. master",
1624                         b : "Printing master",
1625                         c : "Service copy",
1626                         m : "Mixed generation",
1627                         u : "Unknown"
1628                 }
1629             },
1630             j : {    start : 12,
1631                 len   : 1,
1632                 label : "Base of film",
1633                 values: {    a : "Safety base, undetermined",
1634                         c : "Safety base, acetate undetermined",
1635                         d : "Safety base, diacetate",
1636                         l : "Nitrate base",
1637                         m : "Mixed base",
1638                         n : "Not applicable",
1639                         p : "Safety base, polyester",
1640                         r : "Safety base, mixed",
1641                         t : "Safety base, triacetate",
1642                         u : "Unknown",
1643                         z : "Other"
1644                 }
1645             }
1646         }
1647     },
1648     m : {
1649         label     : "Motion Picture",
1650         subfields : {
1651             b : {    start : 1,
1652                 len   : 1,
1653                 label : "SMD",
1654                 values: {    a : "Film cartridge",
1655                         f : "Film cassette",
1656                         r : "Film reel",
1657                         u : "Unspecified",
1658                         z : "Other"
1659                 }
1660             },
1661             d : {    start : 3,
1662                 len   : 1,
1663                 label : "Color",
1664                 values: {    b : "Black-and-white",
1665                         c : "Multicolored",
1666                         h : "Hand-colored",
1667                         m : "Mixed",
1668                         u : "Unknown",
1669                         z : "Other"
1670                 }
1671             },
1672             e : {    start : 4,
1673                 len   : 1,
1674                 label : "Motion picture presentation format",
1675                 values: {    a : "Standard sound aperture, reduced frame",
1676                         b : "Nonanamorphic (wide-screen)",
1677                         c : "3D",
1678                         d : "Anamorphic (wide-screen)",
1679                         e : "Other-wide screen format",
1680                         f : "Standard. silent aperture, full frame",
1681                         u : "Unknown",
1682                         z : "Other"
1683                 }
1684             },
1685             f : {    start : 5,
1686                 len   : 1,
1687                 label : "Sound on medium or separate",
1688                 values: {    a : "Sound on medium",
1689                         b : "Sound separate from medium",
1690                         u : "Unknown"
1691                 }
1692             },
1693             g : {    start : 6,
1694                 len   : 1,
1695                 label : "Medium for sound",
1696                 values: {    a : "Optical sound track on motion picture film",
1697                         b : "Magnetic sound track on motion picture film",
1698                         c : "Magnetic audio tape in cartridge",
1699                         d : "Sound disc",
1700                         e : "Magnetic audio tape on reel",
1701                         f : "Magnetic audio tape in cassette",
1702                         g : "Optical and magnetic sound track on film",
1703                         h : "Videotape",
1704                         i : "Videodisc",
1705                         u : "Unknown",
1706                         z : "Other"
1707                 }
1708             },
1709             h : {    start : 7,
1710                 len   : 1,
1711                 label : "Dimensions",
1712                 values: {    a : "Standard 8 mm.",
1713                         b : "Super 8 mm./single 8 mm.",
1714                         c : "9.5 mm.",
1715                         d : "16 mm.",
1716                         e : "28 mm.",
1717                         f : "35 mm.",
1718                         g : "70 mm.",
1719                         u : "Unknown",
1720                         z : "Other"
1721                 }
1722             },
1723             i : {    start : 8,
1724                 len   : 1,
1725                 label : "Configuration of playback channels",
1726                 values: {    k : "Mixed",
1727                         m : "Monaural",
1728                         n : "Not applicable",
1729                         q : "Multichannel, surround or quadraphonic",
1730                         s : "Stereophonic",
1731                         u : "Unknown",
1732                         z : "Other"
1733                 }
1734             },
1735             j : {    start : 9,
1736                 len   : 1,
1737                 label : "Production elements",
1738                 values: {    a : "Work print",
1739                         b : "Trims",
1740                         c : "Outtakes",
1741                         d : "Rushes",
1742                         e : "Mixing tracks",
1743                         f : "Title bands/inter-title rolls",
1744                         g : "Production rolls",
1745                         n : "Not applicable",
1746                         z : "Other"
1747                 }
1748             }
1749         }
1750     },
1751     k : {
1752         label     : "Non-projected Graphic",
1753         subfields : {
1754             b : {    start : 1,
1755                 len   : 1,
1756                 label : "SMD",
1757                 values: {    c : "Collage",
1758                         d : "Drawing",
1759                         e : "Painting",
1760                         f : "Photo-mechanical print",
1761                         g : "Photonegative",
1762                         h : "Photoprint",
1763                         i : "Picture",
1764                         j : "Print",
1765                         l : "Technical drawing",
1766                         n : "Chart",
1767                         o : "Flash/activity card",
1768                         u : "Unspecified",
1769                         z : "Other"
1770                 }
1771             },
1772             d : {    start : 3,
1773                 len   : 1,
1774                 label : "Color",
1775                 values: {    a : "One color",
1776                         b : "Black-and-white",
1777                         c : "Multicolored",
1778                         h : "Hand-colored",
1779                         m : "Mixed",
1780                         u : "Unknown",
1781                         z : "Other"
1782                 }
1783             },
1784             e : {    start : 4,
1785                 len   : 1,
1786                 label : "Primary support material",
1787                 values: {    a : "Canvas",
1788                         b : "Bristol board",
1789                         c : "Cardboard/illustration board",
1790                         d : "Glass",
1791                         e : "Synthetics",
1792                         f : "Skins",
1793                         g : "Textile",
1794                         h : "Metal",
1795                         m : "Mixed collection",
1796                         o : "Paper",
1797                         p : "Plaster",
1798                         q : "Hardboard",
1799                         r : "Porcelain",
1800                         s : "Stone",
1801                         t : "Wood",
1802                         u : "Unknown",
1803                         z : "Other"
1804                 }
1805             },
1806             f : {    start : 5,
1807                 len   : 1,
1808                 label : "Secondary support material",
1809                 values: {    a : "Canvas",
1810                         b : "Bristol board",
1811                         c : "Cardboard/illustration board",
1812                         d : "Glass",
1813                         e : "Synthetics",
1814                         f : "Skins",
1815                         g : "Textile",
1816                         h : "Metal",
1817                         m : "Mixed collection",
1818                         o : "Paper",
1819                         p : "Plaster",
1820                         q : "Hardboard",
1821                         r : "Porcelain",
1822                         s : "Stone",
1823                         t : "Wood",
1824                         u : "Unknown",
1825                         z : "Other"
1826                 }
1827             }
1828         }
1829     },
1830     g : {
1831         label     : "Projected Graphic",
1832         subfields : {
1833             b : {    start : 1,
1834                 len   : 1,
1835                 label : "SMD",
1836                 values: {    c : "Film cartridge",
1837                         d : "Filmstrip",
1838                         f : "Film filmstrip type",
1839                         o : "Filmstrip roll",
1840                         s : "Slide",
1841                         t : "Transparency",
1842                         z : "Other"
1843                 }
1844             },
1845             d : {    start : 3,
1846                 len   : 1,
1847                 label : "Color",
1848                 values: {    b : "Black-and-white",
1849                         c : "Multicolored",
1850                         h : "Hand-colored",
1851                         m : "Mixed",
1852                         n : "Not applicable",
1853                         u : "Unknown",
1854                         z : "Other"
1855                 }
1856             },
1857             e : {    start : 4,
1858                 len   : 1,
1859                 label : "Base of emulsion",
1860                 values: {    d : "Glass",
1861                         e : "Synthetics",
1862                         j : "Safety film",
1863                         k : "Film base, other than safety film",
1864                         m : "Mixed collection",
1865                         o : "Paper",
1866                         u : "Unknown",
1867                         z : "Other"
1868                 }
1869             },
1870             f : {    start : 5,
1871                 len   : 1,
1872                 label : "Sound on medium or separate",
1873                 values: {    a : "Sound on medium",
1874                         b : "Sound separate from medium",
1875                         u : "Unknown"
1876                 }
1877             },
1878             g : {    start : 6,
1879                 len   : 1,
1880                 label : "Medium for sound",
1881                 values: {    a : "Optical sound track on motion picture film",
1882                         b : "Magnetic sound track on motion picture film",
1883                         c : "Magnetic audio tape in cartridge",
1884                         d : "Sound disc",
1885                         e : "Magnetic audio tape on reel",
1886                         f : "Magnetic audio tape in cassette",
1887                         g : "Optical and magnetic sound track on film",
1888                         h : "Videotape",
1889                         i : "Videodisc",
1890                         u : "Unknown",
1891                         z : "Other"
1892                 }
1893             },
1894             h : {    start : 7,
1895                 len   : 1,
1896                 label : "Dimensions",
1897                 values: {    a : "Standard 8 mm.",
1898                         b : "Super 8 mm./single 8 mm.",
1899                         c : "9.5 mm.",
1900                         d : "16 mm.",
1901                         e : "28 mm.",
1902                         f : "35 mm.",
1903                         g : "70 mm.",
1904                         j : "2 x 2 in. (5 x 5 cm.)",
1905                         k : "2 1/4 x 2 1/4 in. (6 x 6 cm.)",
1906                         s : "4 x 5 in. (10 x 13 cm.)",
1907                         t : "5 x 7 in. (13 x 18 cm.)",
1908                         v : "8 x 10 in. (21 x 26 cm.)",
1909                         w : "9 x 9 in. (23 x 23 cm.)",
1910                         x : "10 x 10 in. (26 x 26 cm.)",
1911                         y : "7 x 7 in. (18 x 18 cm.)",
1912                         u : "Unknown",
1913                         z : "Other"
1914                 }
1915             },
1916             i : {    start : 8,
1917                 len   : 1,
1918                 label : "Secondary support material",
1919                 values: {    c : "Cardboard",
1920                         d : "Glass",
1921                         e : "Synthetics",
1922                         h : "metal",
1923                         j : "Metal and glass",
1924                         k : "Synthetics and glass",
1925                         m : "Mixed collection",
1926                         u : "Unknown",
1927                         z : "Other"
1928                 }
1929             }
1930         }
1931     },
1932     r : {
1933         label     : "Remote-sensing Image",
1934         subfields : {
1935             b : {    start : 1,
1936                 len   : 1,
1937                 label : "SMD",
1938                 values: { u : "Unspecified" }
1939             },
1940             d : {    start : 3,
1941                 len   : 1,
1942                 label : "Altitude of sensor",
1943                 values: {    a : "Surface",
1944                         b : "Airborne",
1945                         c : "Spaceborne",
1946                         n : "Not applicable",
1947                         u : "Unknown",
1948                         z : "Other"
1949                 }
1950             },
1951             e : {    start : 4,
1952                 len   : 1,
1953                 label : "Attitude of sensor",
1954                 values: {    a : "Low oblique",
1955                         b : "High oblique",
1956                         c : "Vertical",
1957                         n : "Not applicable",
1958                         u : "Unknown"
1959                 }
1960             },
1961             f : {    start : 5,
1962                 len   : 1,
1963                 label : "Cloud cover",
1964                 values: {    0 : "0-09%",
1965                         1 : "10-19%",
1966                         2 : "20-29%",
1967                         3 : "30-39%",
1968                         4 : "40-49%",
1969                         5 : "50-59%",
1970                         6 : "60-69%",
1971                         7 : "70-79%",
1972                         8 : "80-89%",
1973                         9 : "90-100%",
1974                         n : "Not applicable",
1975                         u : "Unknown"
1976                 }
1977             },
1978             g : {    start : 6,
1979                 len   : 1,
1980                 label : "Platform construction type",
1981                 values: {    a : "Balloon",
1982                         b : "Aircraft-low altitude",
1983                         c : "Aircraft-medium altitude",
1984                         d : "Aircraft-high altitude",
1985                         e : "Manned spacecraft",
1986                         f : "Unmanned spacecraft",
1987                         g : "Land-based remote-sensing device",
1988                         h : "Water surface-based remote-sensing device",
1989                         i : "Submersible remote-sensing device",
1990                         n : "Not applicable",
1991                         u : "Unknown",
1992                         z : "Other"
1993                 }
1994             },
1995             h : {    start : 7,
1996                 len   : 1,
1997                 label : "Platform use category",
1998                 values: {    a : "Meteorological",
1999                         b : "Surface observing",
2000                         c : "Space observing",
2001                         m : "Mixed uses",
2002                         n : "Not applicable",
2003                         u : "Unknown",
2004                         z : "Other"
2005                 }
2006             },
2007             i : {    start : 8,
2008                 len   : 1,
2009                 label : "Sensor type",
2010                 values: {    a : "Active",
2011                         b : "Passive",
2012                         u : "Unknown",
2013                         z : "Other"
2014                 }
2015             },
2016             j : {    start : 9,
2017                 len   : 2,
2018                 label : "Data type",
2019                 values: {    nn : "Not applicable",
2020                         uu : "Unknown",
2021                         zz : "Other",
2022                         aa : "Visible light",
2023                         da : "Near infrared",
2024                         db : "Middle infrared",
2025                         dc : "Far infrared",
2026                         dd : "Thermal infrared",
2027                         de : "Shortwave infrared (SWIR)",
2028                         df : "Reflective infrared",
2029                         dv : "Combinations",
2030                         dz : "Other infrared data",
2031                         ga : "Sidelooking airborne radar (SLAR)",
2032                         gb : "Synthetic aperture radar (SAR-single frequency)",
2033                         gc : "SAR-multi-frequency (multichannel)",
2034                         gd : "SAR-like polarization",
2035                         ge : "SAR-cross polarization",
2036                         gf : "Infometric SAR",
2037                         gg : "Polarmetric SAR",
2038                         gu : "Passive microwave mapping",
2039                         gz : "Other microwave data",
2040                         ja : "Far ultraviolet",
2041                         jb : "Middle ultraviolet",
2042                         jc : "Near ultraviolet",
2043                         jv : "Ultraviolet combinations",
2044                         jz : "Other ultraviolet data",
2045                         ma : "Multi-spectral, multidata",
2046                         mb : "Multi-temporal",
2047                         mm : "Combination of various data types",
2048                         pa : "Sonar-water depth",
2049                         pb : "Sonar-bottom topography images, sidescan",
2050                         pc : "Sonar-bottom topography, near-surface",
2051                         pd : "Sonar-bottom topography, near-bottom",
2052                         pe : "Seismic surveys",
2053                         pz : "Other acoustical data",
2054                         ra : "Gravity anomales (general)",
2055                         rb : "Free-air",
2056                         rc : "Bouger",
2057                         rd : "Isostatic",
2058                         sa : "Magnetic field",
2059                         ta : "Radiometric surveys"
2060                 }
2061             }
2062         }
2063     },
2064     s : {
2065         label     : "Sound Recording",
2066         subfields : {
2067             b : {    start : 1,
2068                 len   : 1,
2069                 label : "SMD",
2070                 values: {    d : "Sound disc",
2071                         e : "Cylinder",
2072                         g : "Sound cartridge",
2073                         i : "Sound-track film",
2074                         q : "Roll",
2075                         s : "Sound cassette",
2076                         t : "Sound-tape reel",
2077                         u : "Unspecified",
2078                         w : "Wire recording",
2079                         z : "Other"
2080                 }
2081             },
2082             d : {    start : 3,
2083                 len   : 1,
2084                 label : "Speed",
2085                 values: {    a : "16 rpm",
2086                         b : "33 1/3 rpm",
2087                         c : "45 rpm",
2088                         d : "78 rpm",
2089                         e : "8 rpm",
2090                         f : "1.4 mps",
2091                         h : "120 rpm",
2092                         i : "160 rpm",
2093                         k : "15/16 ips",
2094                         l : "1 7/8 ips",
2095                         m : "3 3/4 ips",
2096                         o : "7 1/2 ips",
2097                         p : "15 ips",
2098                         r : "30 ips",
2099                         u : "Unknown",
2100                         z : "Other"
2101                 }
2102             },
2103             e : {    start : 4,
2104                 len   : 1,
2105                 label : "Configuration of playback channels",
2106                 values: {    m : "Monaural",
2107                         q : "Quadraphonic",
2108                         s : "Stereophonic",
2109                         u : "Unknown",
2110                         z : "Other"
2111                 }
2112             },
2113             f : {    start : 5,
2114                 len   : 1,
2115                 label : "Groove width or pitch",
2116                 values: {    m : "Microgroove/fine",
2117                         n : "Not applicable",
2118                         s : "Coarse/standard",
2119                         u : "Unknown",
2120                         z : "Other"
2121                 }
2122             },
2123             g : {    start : 6,
2124                 len   : 1,
2125                 label : "Dimensions",
2126                 values: {    a : "3 in.",
2127                         b : "5 in.",
2128                         c : "7 in.",
2129                         d : "10 in.",
2130                         e : "12 in.",
2131                         f : "16 in.",
2132                         g : "4 3/4 in. (12 cm.)",
2133                         j : "3 7/8 x 2 1/2 in.",
2134                         o : "5 1/4 x 3 7/8 in.",
2135                         s : "2 3/4 x 4 in.",
2136                         n : "Not applicable",
2137                         u : "Unknown",
2138                         z : "Other"
2139                 }
2140             },
2141             h : {    start : 7,
2142                 len   : 1,
2143                 label : "Tape width",
2144                 values: {    l : "1/8 in.",
2145                         m : "1/4in.",
2146                         n : "Not applicable",
2147                         o : "1/2 in.",
2148                         p : "1 in.",
2149                         u : "Unknown",
2150                         z : "Other"
2151                 }
2152             },
2153             i : {    start : 8,
2154                 len   : 1,
2155                 label : "Tape configuration ",
2156                 values: {    a : "Full (1) track",
2157                         b : "Half (2) track",
2158                         c : "Quarter (4) track",
2159                         d : "8 track",
2160                         e : "12 track",
2161                         f : "16 track",
2162                         n : "Not applicable",
2163                         u : "Unknown",
2164                         z : "Other"
2165                 }
2166             },
2167             m : {    start : 12,
2168                 len   : 1,
2169                 label : "Special playback",
2170                 values: {    a : "NAB standard",
2171                         b : "CCIR standard",
2172                         c : "Dolby-B encoded, standard Dolby",
2173                         d : "dbx encoded",
2174                         e : "Digital recording",
2175                         f : "Dolby-A encoded",
2176                         g : "Dolby-C encoded",
2177                         h : "CX encoded",
2178                         n : "Not applicable",
2179                         u : "Unknown",
2180                         z : "Other"
2181                 }
2182             },
2183             n : {    start : 13,
2184                 len   : 1,
2185                 label : "Capture and storage",
2186                 values: {    a : "Acoustical capture, direct storage",
2187                         b : "Direct storage, not acoustical",
2188                         d : "Digital storage",
2189                         e : "Analog electrical storage",
2190                         u : "Unknown",
2191                         z : "Other"
2192                 }
2193             }
2194         }
2195     },
2196     f : {
2197         label     : "Tactile Material",
2198         subfields : {
2199             b : {    start : 1,
2200                 len   : 1,
2201                 label : "SMD",
2202                 values: {    a : "Moon",
2203                         b : "Braille",
2204                         c : "Combination",
2205                         d : "Tactile, with no writing system",
2206                         u : "Unspecified",
2207                         z : "Other"
2208                 }
2209             },
2210             d : {    start : 3,
2211                 len   : 2,
2212                 label : "Class of braille writing",
2213                 values: {    a : "Literary braille",
2214                         b : "Format code braille",
2215                         c : "Mathematics and scientific braille",
2216                         d : "Computer braille",
2217                         e : "Music braille",
2218                         m : "Multiple braille types",
2219                         n : "Not applicable",
2220                         u : "Unknown",
2221                         z : "Other"
2222                 }
2223             },
2224             e : {    start : 4,
2225                 len   : 1,
2226                 label : "Level of contraction",
2227                 values: {    a : "Uncontracted",
2228                         b : "Contracted",
2229                         m : "Combination",
2230                         n : "Not applicable",
2231                         u : "Unknown",
2232                         z : "Other"
2233                 }
2234             },
2235             f : {    start : 6,
2236                 len   : 3,
2237                 label : "Braille music format",
2238                 values: {    a : "Bar over bar",
2239                         b : "Bar by bar",
2240                         c : "Line over line",
2241                         d : "Paragraph",
2242                         e : "Single line",
2243                         f : "Section by section",
2244                         g : "Line by line",
2245                         h : "Open score",
2246                         i : "Spanner short form scoring",
2247                         j : "Short form scoring",
2248                         k : "Outline",
2249                         l : "Vertical score",
2250                         n : "Not applicable",
2251                         u : "Unknown",
2252                         z : "Other"
2253                 }
2254             },
2255             g : {    start : 9,
2256                 len   : 1,
2257                 label : "Special physical characteristics",
2258                 values: {    a : "Print/braille",
2259                         b : "Jumbo or enlarged braille",
2260                         n : "Not applicable",
2261                         u : "Unknown",
2262                         z : "Other"
2263                 }
2264             }
2265         }
2266     },
2267     v : {
2268         label     : "Videorecording",
2269         subfields : {
2270             b : {    start : 1,
2271                 len   : 1,
2272                 label : "SMD",
2273                 values: {     c : "Videocartridge",
2274                         d : "Videodisc",
2275                         f : "Videocassette",
2276                         r : "Videoreel",
2277                         u : "Unspecified",
2278                         z : "Other"
2279                 }
2280             },
2281             d : {    start : 3,
2282                 len   : 1,
2283                 label : "Color",
2284                 values: {    b : "Black-and-white",
2285                         c : "Multicolored",
2286                         m : "Mixed",
2287                         n : "Not applicable",
2288                         u : "Unknown",
2289                         z : "Other"
2290                 }
2291             },
2292             e : {    start : 4,
2293                 len   : 1,
2294                 label : "Videorecording format",
2295                 values: {    a : "Beta",
2296                         b : "VHS",
2297                         c : "U-matic",
2298                         d : "EIAJ",
2299                         e : "Type C",
2300                         f : "Quadruplex",
2301                         g : "Laserdisc",
2302                         h : "CED",
2303                         i : "Betacam",
2304                         j : "Betacam SP",
2305                         k : "Super-VHS",
2306                         m : "M-II",
2307                         o : "D-2",
2308                         p : "8 mm.",
2309                         q : "Hi-8 mm.",
2310                         u : "Unknown",
2311                         v : "DVD",
2312                         z : "Other"
2313                 }
2314             },
2315             f : {    start : 5,
2316                 len   : 1,
2317                 label : "Sound on medium or separate",
2318                 values: {    a : "Sound on medium",
2319                         b : "Sound separate from medium",
2320                         u : "Unknown"
2321                 }
2322             },
2323             g : {    start : 6,
2324                 len   : 1,
2325                 label : "Medium for sound",
2326                 values: {    a : "Optical sound track on motion picture film",
2327                         b : "Magnetic sound track on motion picture film",
2328                         c : "Magnetic audio tape in cartridge",
2329                         d : "Sound disc",
2330                         e : "Magnetic audio tape on reel",
2331                         f : "Magnetic audio tape in cassette",
2332                         g : "Optical and magnetic sound track on motion picture film",
2333                         h : "Videotape",
2334                         i : "Videodisc",
2335                         u : "Unknown",
2336                         z : "Other"
2337                 }
2338             },
2339             h : {    start : 7,
2340                 len   : 1,
2341                 label : "Dimensions",
2342                 values: {    a : "8 mm.",
2343                         m : "1/4 in.",
2344                         o : "1/2 in.",
2345                         p : "1 in.",
2346                         q : "2 in.",
2347                         r : "3/4 in.",
2348                         u : "Unknown",
2349                         z : "Other"
2350                 }
2351             },
2352             i : {    start : 8,
2353                 len   : 1,
2354                 label : "Configuration of playback channel",
2355                 values: {    k : "Mixed",
2356                         m : "Monaural",
2357                         n : "Not applicable",
2358                         q : "Multichannel, surround or quadraphonic",
2359                         s : "Stereophonic",
2360                         u : "Unknown",
2361                         z : "Other"
2362                 }
2363             }
2364         }
2365     }
2366 };
2367