25d8ec41aa36683e4c662bf0149fd53ac65e0ed5
[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         rule_warnings = []; disable_widgets('explain_marc');
49         tag_seen = {};
50         var rows = document.getElementById('ctrl_rows').childNodes;
51         for (var r in rows) {
52                 if ((typeof(rows[r]) == 'object')&&(rows[r].tagName == 'row')) {
53                         test_tagnumber_rule(rows[r]);
54                 }
55         }
56         rows = document.getElementById('data_rows').childNodes;
57         for (var r in rows) {
58                 if (    (typeof(rows[r]) == 'object') &&
59                         (rows[r].tagName == 'row') &&
60                         (rows[r].getAttribute('hidden') != 'true')
61                 ) {
62                         test_tagnumber_rule(rows[r]);
63                         test_ind1_rule(rows[r]);
64                         test_ind2_rule(rows[r]);
65                         test_subfield_rule(rows[r]);
66                 }
67         }
68         if (rule_warnings.length > 0) { enable_widgets('explain_marc'); }
69         mw.sdump('D_CAT','Exiting handle_tag_change: ' + timer_elapsed('cat') + '\n');
70 }
71
72 function test_tagnumber_rule(r) {
73         // rows (rows) -> row (r) -> wrapper (w) -> textbox (t)
74         try {
75         var t = r.firstChild.firstChild;
76         if (t.value.length > 3) { 
77                 t.value = t.value.substr(0,3); 
78         } else if (t.value.length < 3) {
79                 switch(t.value.length) {
80                         case 2: t.value = '0' + t.value; break;
81                         case 1: t.value = '00' + t.value; break;
82                         case 0: t.value = '000'; break;
83                 }
84         }
85         removeCSSClass(t,'invalid');
86         if (marc_rules[t.value]) {
87                 var rule = marc_rules[t.value];
88                 if (tag_seen[t.value]) { tag_seen[t.value]++; } else { tag_seen[t.value] = 1; }
89                 if ( (rule.repeat == 'NR') && (tag_seen[t.value] > 1) ) {
90                         add_css_class(t,'invalid');
91                         var s = 'Tag ' + t.value + ' should be Non-Repeating\n';
92                         rule_warnings.push(s); mw.sdump('D_CAT',s);
93                 }
94         } else if (t.value != 'LDR') {
95                 add_css_class(t,'invalid');
96                 var s = 'Tag ' + t.value + ' is unknown.\n';
97                 rule_warnings.push(s); mw.sdump('D_CAT',s);
98         }
99         } catch(E) {
100                 handle_error();
101         }
102 }
103
104 function test_ind1_rule(r) {
105         // rows (rows) -> row (r) -> wrapper (w) -> textbox (t)
106         var tagnumber = r.childNodes[0].firstChild.value;
107         var ind1 = r.childNodes[1].firstChild;
108         removeCSSClass(ind1,'invalid');
109         if ((marc_rules[tagnumber]) && (marc_rules[tagnumber].ind1)) {
110                 var regex = '/^[' + marc_rules[tagnumber].ind1.allowed + ']$/';
111                 if (! ind1.value.match(eval(regex)) ) {
112                         add_css_class(ind1,'invalid');
113                         var s = 'Tag ' + tagnumber + ' Indicator 1 should be one of these characters: "' + marc_rules[tagnumber].ind1.allowed + '"\n';
114                         rule_warnings.push(s); mw.sdump('D_CAT',s);
115                 }
116         }
117 }
118
119 function test_ind2_rule(r) {
120         // rows (rows) -> row (r) -> wrapper (w) -> textbox (t)
121         var tagnumber = r.childNodes[0].firstChild.value;
122         var ind2 = r.childNodes[2].firstChild;
123         removeCSSClass(ind2,'invalid');
124         if ((marc_rules[tagnumber]) && (marc_rules[tagnumber].ind2)) {
125                 var regex = '/^[' + marc_rules[tagnumber].ind2.allowed + ']$/';
126                 if (! ind2.value.match(eval(regex)) ) {
127                         add_css_class(ind2,'invalid');
128                         var s = 'Tag ' + tagnumber + ' Indicator 2 should be one of these characters: "' + marc_rules[tagnumber].ind2.allowed + '"\n';
129                         rule_warnings.push(s); mw.sdump('D_CAT',s);
130                 }
131         }
132 }
133
134 function test_subfield_rule(r) {
135         // rows (rows) -> row (r) -> wrapper (w) -> textbox (t)
136         var tagnumber = r.childNodes[0].firstChild.value;
137         var data = r.childNodes[3].firstChild;
138         removeCSSClass(data,'invalid');
139         if (marc_rules[tagnumber]) {
140                 var datastring = data.value.replace(/^\s+/,'').replace(/\s+$/,'');
141                 var subf_array = datastring.split(String.fromCharCode(8225));
142                 if ( (subf_array[0] == '')||(subf_array[0] == null) ) {
143                         subf_array.shift();
144                 } else {
145                         add_css_class(data,'invalid');
146                         var s = 'DEBUG: Need to add code to make an implicit subfield-a\n';
147                         rule_warnings.push(s); mw.sdump('D_CAT',s);
148                         subf_array.shift();
149                 }
150                 var subf_seen = {};
151                 for (var i in subf_array) {
152                         if ((subf_array[i]=='')||(subf_array==null)) { 
153                                 add_css_class(data,'invalid');
154                                 var s = 'You have incomplete subfield delimiters.\n';
155                                 rule_warnings.push(s); mw.sdump('D_CAT',s);
156                                 continue;
157                         }
158                         var s_ind = subf_array[i].substr(0,1);
159                         if (subf_seen[s_ind]) { subf_seen[s_ind]++; } else { subf_seen[s_ind] = 1; }
160                         var rule = marc_rules[tagnumber][s_ind];
161                         if (rule) {
162                                 if ( (rule.repeat == 'NR') && (subf_seen[s_ind]>1) ) {
163                                         add_css_class(data,'invalid');
164                                         var s = 'Tag ' + tagnumber + ' subfield-' + s_ind + ' should be Non-Repeating\n';
165                                         rule_warnings.push(s); mw.sdump('D_CAT',s);
166                                 }
167                         } else {
168                                 add_css_class(data,'invalid');
169                                 var s = 'Tag ' + tagnumber + ' does not have a subfield-' + s_ind + '\n';
170                                 rule_warnings.push(s); mw.sdump('D_CAT',s);
171                         }
172                 }
173         }
174 }