source: trunk/htdocs/scripts/atnf-validation.js

Last change on this file was 193, checked in by MatthewWhiting, 17 years ago
  • Fixed bugs in view_profiles that meant some figures were not being plotted.
  • Updated scripts.
  • Fixed bug in query by pulsar name.
  • Property svn:executable set to *
File size: 8.0 KB
Line 
1function Validator(frm) {
2                this.form = frm;
3                this.fields = {};
4                this.beforeSubmitHandler = null;
5                Validator.registerValidator(this);
6        }
7
8Validator.validators = [];
9
10OOUtils.extend(Validator, {
11        doValidation: function() {
12                for (var valInd in Validator.validators) {
13                        if (Validator.validators[valInd].form == this) {
14                                return Validator.validators[valInd].validate();
15                        }
16                }
17        },
18        registerValidator: function(val) {
19                val.form.onsubmit = Validator.doValidation;
20                Validator.validators.push(val);
21        }
22});
23
24Validator.prototype = {
25        validate: function() {
26                for (var fieldName in this.fields) {
27                        var field = this.fields[fieldName].field;
28                        for (var valInd in this.fields[fieldName].validators) {
29                                if (!this.fields[fieldName].validators[valInd].validate(field)) {
30                                        alert(FieldValidator.getFieldName(field) + " requires " + this.fields[fieldName].validators[valInd].requirement);
31                                        field.select();
32                                        return false;
33                                }
34                        }
35                }
36               
37                if (this.beforeSubmitHandler) {
38                        return this.beforeSubmitHandler(this);
39                }
40        },
41        addFieldValidator: function(field, val) {
42                if (!this.fields[field.id]) {
43                        this.fields[field.id] = {field: field, validators: []};
44                }
45                this.fields[field.id].validators.push(val);
46        },
47        setBeforeSubmitHandler: function(handler) {
48                this.beforeSubmitHandler = handler;
49        },
50        getField: function(fieldObj) {
51               
52                if (typeof(fieldObj) != "string") {
53                        fieldObj = fieldObj.id;
54                }
55               
56                return this.fields[fieldObj];
57        },
58        getValidator: function(fieldObj, validatorType) {
59                for (var validator in fieldObj.validators) {
60                        var currentValidator = fieldObj.validators[validator];
61                        if (currentValidator instanceof validatorType) {
62                                return currentValidator;
63                        }
64                }
65               
66                return null;
67        }
68};
69
70function FieldValidator() { }
71
72OOUtils.extend(FieldValidator, {
73        getText: function(node) {
74       
75                if (node.title) {
76                        return node.title;
77                }
78               
79                if (node.data) {
80                        return node.data;
81                }
82               
83                var text = "";
84                for (var child in node.childNodes) {
85                        text += FieldValidator.getText(node.childNodes[child]);
86                }
87               
88                return text;
89        },
90        getFieldName: function(field) {
91                var fieldName = "A field";
92                var labels = document.getElementsByTagName("label");
93                for (var labelInd in labels) {
94                        if (labels[labelInd].htmlFor == field.id) {
95                                fieldName = labels[labelInd].title || FieldValidator.getText(labels[labelInd]);
96                                break;
97                        }
98                }
99                return fieldName;
100        }
101});
102
103
104function REValidator() { }
105
106REValidator.prototype = {
107        requirement: "any value",
108        re: /.*/,
109        validate: function(field) {
110                var value = field.value;
111                if (!this.re.test(value.trim())) {
112                        return false;
113                }
114                return true;
115        }
116}
117
118function MandatoryValidator(childValidator) {
119        if (childValidator) {
120                this.requirement = childValidator.requirement;
121                this.childValidator = childValidator;
122        }
123}
124
125MandatoryValidator.prototype = new REValidator();
126OOUtils.extend(MandatoryValidator.prototype, {
127        requirement: "a value",
128        re: /^.+$/,
129        validate: function(field) {
130                if (!REValidator.prototype.validate.apply(this, arguments)) {
131                        return false;
132                }
133                if (this.childValidator) {
134                        return this.childValidator.validate(field);
135                }
136                return true;
137        }
138});
139
140function IntegerValidator() { }
141
142IntegerValidator.prototype = new REValidator();
143OOUtils.extend(IntegerValidator.prototype, {
144        requirement: "an integer value",
145        re: /^\-?\d*$/
146});
147
148function RealValidator() { }
149
150RealValidator.prototype = new REValidator();
151OOUtils.extend(RealValidator.prototype, {
152        requirement: "a real value",
153        re: /^\d*(\.\d+)?$/
154});
155
156function DateValidator() {
157        this.validatedDate = null;
158}
159
160DateValidator.prototype = new FieldValidator();
161OOUtils.extend(DateValidator.prototype, {
162        validate: function(field) {
163                var dateObj;
164               
165                this.validatedDate = null;
166               
167                if (field.value.trim() == "") {
168                        return true;
169                }
170               
171                try {
172                        dateObj = DateValidator.parse(field.value);
173                } catch (e) {
174                        return false;
175                }
176               
177                this.validatedDate = dateObj;
178                return true;
179        },
180        requirement: "a valid date"
181});
182       
183DateValidator.parse = function(dateStr) {
184        var fullDateRE = /(\d+|\D{3,9})[\-\\\/\.](\d+|\D{3,9})[\-\\\/\.](\d+|\D{3,9})/;
185        dateStr = dateStr.replace(/\s/g, "");
186        if (!re.test(dateStr))
187                throw "' " + dateStr + " ' is not a valid date string";
188       
189        var foundMonth = 0;
190        var foundYear = 0;
191        var foundDay = 0;
192       
193        var matches = re.exec(dateStr);
194        var monthTextRe = /\D{3,9}/;
195       
196        for (var x = 1; x <= 3; x++) {
197                if (monthTextRe.test(matches[x])) {
198                        if (foundMonth != 0)
199                                throw "' " + dateStr + " ' is not a valid date string";
200                       
201                        matches[x] = this.getMonthFromStr(matches[x]);
202                       
203                        if (!matches[x])
204                                throw "' " + dateStr + " ' is not a valid date string";
205                               
206                        foundMonth = x;
207                } else {
208                        var num = new Number(matches[x]);
209                        if (num > 31 || num < 1) {
210                                if (foundYear != 0)
211                                        throw "' " + dateStr + " ' is not a valid date string";
212                                       
213                                foundYear = x;
214                        } else {
215                                if (num > 12) {
216                                        if (foundDay != 0)
217                                                throw "' " + dateStr + " ' is not a valid date string";
218                                       
219                                        foundDay = x;
220                                }
221                        }
222                }
223        }
224       
225        if (foundYear != 0 && foundMonth != 0) {
226                foundDay = (6 - (foundYear + foundMonth));
227        } else {
228                if (foundYear != 0 && foundDay != 0) {
229                        foundMonth = (6 - (foundYear + foundDay));
230                } else {
231                        if (foundMonth != 0 && foundDay != 0) {
232                                foundYear = (6 - (foundMonth + foundDay));
233                        }
234                }               
235        }
236       
237        if (foundMonth == 0 && foundYear == 0 && foundDay == 0) {
238                foundDay = 1; foundMonth = 2; foundYear = 3;
239        }
240       
241        if (foundMonth == 0 || foundYear == 0 || foundDay == 0) {
242                if (foundMonth != 0) {
243                        switch (foundMonth) {
244                                case 3 : throw "' " + dateStr + " ' is not a valid date string";
245                                case 2 : foundDay = 1; foundYear = 3; break;
246                                case 1 : foundDay = 2; foundYear = 3; break;
247                        }
248                }
249               
250                if (foundYear != 0) {
251                        switch (foundYear) {
252                                case 3 : foundDay = 1; foundMonth = 2; break;
253                                case 2 : throw "' " + dateStr + " ' is not a valid date string";
254                                case 1 : foundMonth = 2; foundDay = 3; break;
255                        }
256                }
257               
258                if (foundDay != 0) {
259                        switch (foundDay) {
260                                case 3 : foundYear = 1; foundMonth = 2; break;
261                                case 2 : throw "' " + dateStr + " ' is not a valid date string";
262                                case 1 : foundMonth = 2; foundYear = 3; break;
263                        }
264                }
265        }
266       
267        var year, month, day;
268       
269        year = Number(matches[foundYear]);
270        month = Number(matches[foundMonth]);
271        day = Number(matches[foundDay]);
272       
273        var date = new Date(year, month - 1, day);
274        return date;
275}
276
277DateValidator.getMonthFromStr = function(str) {
278        var names = ["january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"];
279       
280        for (var month in names) {
281                if (str.toLowerCase() == names[month] || names[month].indexOf(str.toLowerCase()) == 0) {
282                        return new Number(month) + 1;
283                }
284        }
285       
286        return false;
287}
288
289function TimeValidator() {
290        this.validatedDate = null;
291}
292
293TimeValidator.prototype = new FieldValidator();
294TimeValidator.prototype.requirement = "a valid time";
295TimeValidator.prototype.validate = function(field) {
296                var dateObj;
297               
298                this.validatedDate = null;
299               
300                if (field.value.trim() == "") {
301                        return true;
302                }
303               
304                try {
305                        dateObj = TimeValidator.parse(field.value);
306                } catch (e) {
307                        return false;
308                }
309               
310                this.validatedDate = dateObj;
311                return true;
312}
313
314TimeValidator.parse = function(timeStr) {
315        var re = /^(\d{1,2})(:(\d{2}))?(:(\d{2}))?(AM|PM)?$/i;
316        timeStr = timeStr.replace(/\s/g, "");
317       
318        if (!re.test(timeStr)) {
319                throw "'" + timeStr + "' is not a valid time string";
320        }
321       
322        var matches = re.exec(timeStr);
323       
324        var hours = Number(matches[1]);
325        var minutes = 0;
326        var seconds = 0;
327        var noonRelation = null;
328       
329        if (matches[2] != null) {
330                minutes = Number(matches[3]);
331        }
332       
333        if (matches[4] != null) {
334                seconds = Number(matches[5]);
335        }
336       
337        if (matches[6] != null) {
338                noonRelation = matches[6];
339        }
340       
341        if (noonRelation != null) {
342                if (hours > 12 || hours < 1) {
343                        throw "'" + timeStr + "' is not a valid time string";
344                }
345               
346                hours %= 12;
347                if (noonRelation.toLowerCase() == "pm") {
348                        hours += 12;
349                }
350        }
351       
352        if (minutes > 59 || seconds > 59 || hours > 23) {
353                throw "'" + timeStr + "' is not a valid time string";
354        }
355       
356        var date = new Date(0);
357        date.setSeconds(seconds);
358        date.setMinutes(minutes);
359        date.setHours(hours);
360
361        return date;
362}
363
364function DateTimeValidator() {
365        this.validateDate = null;
366}
Note: See TracBrowser for help on using the repository browser.