cleanup
[Evergreen.git] / Evergreen / staff_client / chrome / content / evergreen / cat / marc_validate.js
1 var rule_warnings = [];
2 var tag_seen;
3
4 function explain_marc() {
5         var s = '';
6         for (var w in rule_warnings) {
7                 s = s + rule_warnings[w];
8         }
9         alert(s);
10 }
11
12 function legend_marc() {
13         var s = '';
14         var rows = document.getElementById('ctrl_rows').childNodes;
15         for (var r in rows) {
16                 if (    (typeof(rows[r]) == 'object') &&
17                         (rows[r].tagName == 'row') &&
18                         (rows[r].getAttribute('hidden') != 'true')
19                 ) {
20                         var tagnumber = rows[r].firstChild.firstChild.value;
21                         if ((marc_rules[tagnumber])&&(marc_rules[tagnumber].desc)) {
22                                 s = s + tagnumber + '\t' + marc_rules[tagnumber].desc + '\n';
23                         } else {
24                                 s = s + tagnumber + '\n';
25                         }
26                 }
27         }
28         rows = document.getElementById('data_rows').childNodes;
29         for (var r in rows) {
30                 if (    (typeof(rows[r]) == 'object') &&
31                         (rows[r].tagName == 'row') &&
32                         (rows[r].getAttribute('hidden') != 'true')
33                 ) {
34                         var tagnumber = rows[r].firstChild.firstChild.value;
35                         if ((marc_rules[tagnumber])&&(marc_rules[tagnumber].desc)) {
36                                 s = s + tagnumber + '\t' + marc_rules[tagnumber].desc + '\n';
37                         } else {
38                                 s = s + tagnumber + '\n';
39                         }
40                 }
41         }
42         alert(s);
43
44 }
45
46 function handle_tag_change(ev) {
47         mw.sdump('D_CAT','Entering handle_tag_change: ' + timer_elapsed('cat') + '\n');
48         try {
49         rule_warnings = []; disable_widgets('explain_marc');
50         tag_seen = {};
51         var rows = document.getElementById('ctrl_rows').childNodes;
52         for (var r in rows) {
53                 if ((typeof(rows[r]) == 'object')&&(rows[r].tagName == 'row')) {
54                         test_tagnumber_rule(rows[r]);
55                 }
56         }
57         rows = document.getElementById('data_rows').childNodes;
58         for (var r in rows) {
59                 if (    (typeof(rows[r]) == 'object') &&
60                         (rows[r].tagName == 'row') &&
61                         (rows[r].getAttribute('hidden') != 'true')
62                 ) {
63                         test_tagnumber_rule(rows[r]);
64                         test_ind1_rule(rows[r]);
65                         test_ind2_rule(rows[r]);
66                         test_subfield_rule(rows[r]);
67                 }
68         }
69         if (rule_warnings.length > 0) { 
70                 enable_widgets('explain_marc'); }
71         } catch(E) {
72                 handle_error(E);
73         }
74         mw.sdump('D_CAT','Exiting handle_tag_change: ' + timer_elapsed('cat') + '\n');
75 }
76
77 function test_tagnumber_rule(r) {
78         // rows (rows) -> row (r) -> wrapper (w) -> textbox (t)
79         try {
80         var t = r.firstChild.firstChild;
81         if (t.value.length > 3) { 
82                 t.value = t.value.substr(0,3); 
83         } else if (t.value.length < 3) {
84                 switch(t.value.length) {
85                         case 2: t.value = '0' + t.value; break;
86                         case 1: t.value = '00' + t.value; break;
87                         case 0: t.value = '000'; break;
88                 }
89         }
90         removeCSSClass(t,'invalid');
91         if (marc_rules[t.value]) {
92                 var rule = marc_rules[t.value];
93                 if (tag_seen[t.value]) { tag_seen[t.value]++; } else { tag_seen[t.value] = 1; }
94                 if ( (rule.repeat == 'NR') && (tag_seen[t.value] > 1) ) {
95                         addCSSClass(t,'invalid');
96                         var s = 'Tag ' + t.value + ' should be Non-Repeating\n';
97                         rule_warnings.push(s); mw.sdump('D_CAT',s);
98                 }
99         } else if (t.value != 'LDR') {
100                 addCSSClass(t,'invalid');
101                 var s = 'Tag ' + t.value + ' is unknown.\n';
102                 rule_warnings.push(s); mw.sdump('D_CAT',s);
103         }
104         } catch(E) {
105                 handle_error();
106         }
107 }
108
109 function test_ind1_rule(r) {
110         // rows (rows) -> row (r) -> wrapper (w) -> textbox (t)
111         var tagnumber = r.childNodes[0].firstChild.value;
112         var ind1 = r.childNodes[1].firstChild;
113         removeCSSClass(ind1,'invalid');
114         if ((marc_rules[tagnumber]) && (marc_rules[tagnumber].ind1)) {
115                 var regex = '/^[' + marc_rules[tagnumber].ind1.allowed + ']$/';
116                 if (! ind1.value.match(eval(regex)) ) {
117                         addCSSClass(ind1,'invalid');
118                         var s = 'Tag ' + tagnumber + ' Indicator 1 should be one of these characters: "' + marc_rules[tagnumber].ind1.allowed + '"\n';
119                         rule_warnings.push(s); mw.sdump('D_CAT',s);
120                 }
121         }
122 }
123
124 function test_ind2_rule(r) {
125         // rows (rows) -> row (r) -> wrapper (w) -> textbox (t)
126         var tagnumber = r.childNodes[0].firstChild.value;
127         var ind2 = r.childNodes[2].firstChild;
128         removeCSSClass(ind2,'invalid');
129         if ((marc_rules[tagnumber]) && (marc_rules[tagnumber].ind2)) {
130                 var regex = '/^[' + marc_rules[tagnumber].ind2.allowed + ']$/';
131                 if (! ind2.value.match(eval(regex)) ) {
132                         addCSSClass(ind2,'invalid');
133                         var s = 'Tag ' + tagnumber + ' Indicator 2 should be one of these characters: "' + marc_rules[tagnumber].ind2.allowed + '"\n';
134                         rule_warnings.push(s); mw.sdump('D_CAT',s);
135                 }
136         }
137 }
138
139 function test_subfield_rule(r) {
140         // rows (rows) -> row (r) -> wrapper (w) -> textbox (t)
141         var tagnumber = r.childNodes[0].firstChild.value;
142         var data = r.childNodes[3].firstChild;
143         removeCSSClass(data,'invalid');
144         if (marc_rules[tagnumber]) {
145                 var datastring = data.value.replace(/^\s+/,'').replace(/\s+$/,'');
146                 var subf_array = datastring.split(String.fromCharCode(8225));
147                 if ( (subf_array[0] == '')||(subf_array[0] == null) ) {
148                         subf_array.shift();
149                 } else {
150                         addCSSClass(data,'invalid');
151                         var s = 'DEBUG: Need to add code to make an implicit subfield-a\n';
152                         rule_warnings.push(s); mw.sdump('D_CAT',s);
153                         subf_array.shift();
154                 }
155                 var subf_seen = {};
156                 for (var i in subf_array) {
157                         if ((subf_array[i]=='')||(subf_array==null)) { 
158                                 addCSSClass(data,'invalid');
159                                 var s = 'You have incomplete subfield delimiters.\n';
160                                 rule_warnings.push(s); mw.sdump('D_CAT',s);
161                                 continue;
162                         }
163                         var s_ind = subf_array[i].substr(0,1);
164                         if (subf_seen[s_ind]) { subf_seen[s_ind]++; } else { subf_seen[s_ind] = 1; }
165                         var rule = marc_rules[tagnumber][s_ind];
166                         if (rule) {
167                                 if ( (rule.repeat == 'NR') && (subf_seen[s_ind]>1) ) {
168                                         addCSSClass(data,'invalid');
169                                         var s = 'Tag ' + tagnumber + ' subfield-' + s_ind + ' should be Non-Repeating\n';
170                                         rule_warnings.push(s); mw.sdump('D_CAT',s);
171                                 }
172                         } else {
173                                 addCSSClass(data,'invalid');
174                                 var s = 'Tag ' + tagnumber + ' does not have a subfield-' + s_ind + '\n';
175                                 rule_warnings.push(s); mw.sdump('D_CAT',s);
176                         }
177                 }
178         }
179 }