root/trunk/Wierszowki/Wierszowki.Web/Scripts/xVal.AspNetNative.js @ 966

Wersja 842, 12.7 KB (wprowadzona przez alina, 17 years temu)

fix #207, #193, #205

Line 
1var xVal = xVal || {
2    Plugins: {},
3    AttachValidator: function(elementPrefix, rulesConfig, pluginName) {
4        if (pluginName != null)
5            this.Plugins[pluginName].AttachValidator(elementPrefix, rulesConfig);
6        else
7            for (var key in this.Plugins) {
8            this.Plugins[key].AttachValidator(elementPrefix, rulesConfig);
9            return;
10        }
11    }
12};
13
14var Page_Validators;
15var Page_ValidationActive;
16
17xVal.Plugins["AspNetNative"] = {
18    AttachValidator: function(elementPrefix, rulesConfig) {
19        Page_Validators = new Array();
20
21        for (var i = 0; i < rulesConfig.Fields.length; i++) {
22            var fieldName = rulesConfig.Fields[i].FieldName;
23            var fieldRules = rulesConfig.Fields[i].FieldRules;
24
25            // Is there a matching DOM element?
26            var elemId = (elementPrefix ? elementPrefix + "." : "") + fieldName;
27            var elem = document.getElementById(elemId);
28
29            if (elem) {
30                for (var j = 0; j < fieldRules.length; j++) {
31                    var ruleName = fieldRules[j].RuleName;
32                    var ruleParams = fieldRules[j].RuleParameters;
33                    var errorText = (typeof (fieldRules[j].Message) == 'undefined' ? null : fieldRules[j].Message);
34                    this._attachRuleToDOMElement(ruleName, ruleParams, errorText, elem);
35                }
36            }
37        }
38
39        Page_ValidationActive = false;
40        if (typeof (ValidatorOnLoad) == "function")
41            ValidatorOnLoad();
42    },
43
44    _attachRuleToDOMElement: function(ruleName, ruleParams, errorText, element) {
45        var ruleConfig = this._getAspNetRuleConfig(ruleName, ruleParams, errorText);
46        if (ruleConfig == null)
47            return;
48
49        // Find parent form and ensure it's enabled for validation
50        var parentForm = element;
51        while (parentForm.tagName != "FORM") {
52            parentForm = parentForm.parentNode;
53            if (parentForm == null)
54                alert("Error: Element " + element.id + " is not in a form");
55        }
56        this._ensureValidationEnabledOnForm(parentForm);
57
58        var messageContainer = this._createMessageContainer(element, ruleConfig.errorMessage);
59
60        Page_Validators[Page_Validators.length] = messageContainer;
61
62        messageContainer.controltovalidate = element.id;
63        messageContainer.errormessage = ruleConfig.errorMessage;
64        messageContainer.display = "Dynamic";
65        messageContainer.evaluationfunction = ruleConfig.evaluationFunction;
66        for (var i = 0; i < ruleConfig.params.length; i++)
67            messageContainer[ruleConfig.params[i].name] = ruleConfig.params[i].value;
68    },
69
70    _getAspNetRuleConfig: function(ruleName, ruleParams, fixedErrorText) {
71        switch (ruleName) {
72            case "Required":
73                return {
74                    evaluationFunction: "RequiredFieldValidatorEvaluateIsValid",
75                    params: [{ name: "initialvalue", value: ""}],
76                    errorMessage: fixedErrorText || "Please enter a value."
77                };
78            case "Range":
79                var message;
80                var min = null, max = null;
81                if (ruleParams.Type != "datetime") {
82                    min = typeof (ruleParams.Min) == 'undefined' ? null : ruleParams.Min;
83                    max = typeof (ruleParams.Max) == 'undefined' ? null : ruleParams.Max;
84                } else {
85                    if (typeof (ruleParams.MinYear) != 'undefined')
86                        min = new Date(ruleParams.MinYear, ruleParams.MinMonth - 1, ruleParams.MinDay, ruleParams.MinHour, ruleParams.MinMinute, ruleParams.MinSecond);
87                    if (typeof (ruleParams.MaxYear) != 'undefined')
88                        max = new Date(ruleParams.MaxYear, ruleParams.MaxMonth - 1, ruleParams.MaxDay, ruleParams.MaxHour, ruleParams.MaxMinute, ruleParams.MaxSecond);
89                }
90                if (min != null) {
91                    if (max != null)
92                        message = "Please enter a value between " + min + " and " + max + ".";
93                    else
94                        message = "Please enter a value of at least " + min + ".";
95                }
96                else
97                    message = "Please enter a value no more than " + max + ".";
98
99                var aspNetNativeType = ruleParams.Type == "string" ? "String" :
100                                       ruleParams.Type == "integer" ? "Integer" :
101                                       ruleParams.Type == "decimal" ? "Double" :
102                                       ruleParams.Type == "datetime" ? "Date" : alert("Unknown range type:" + ruleParams.Type);
103                if (aspNetNativeType != "Date") {
104                    min = "" + (min || Number.MIN_VALUE);
105                    max = "" + (max || Number.MAX_VALUE);
106                }
107                return {
108                    evaluationFunction: ruleParams.Type != "datetime" ? "RangeValidatorEvaluateIsValid" : "xVal_AspNetNative_Range_DateTime",
109                    params: [{ name: "decimalchar", value: "." },
110                             { name: "type", value: aspNetNativeType },
111                             { name: "minimumvalue", value: min },
112                             { name: "maximumvalue", value: max}],
113                    errorMessage: fixedErrorText || message
114                };
115            case "RegEx":
116                return {
117                    evaluationFunction: "xVal_AspNetNative_RegEx",
118                    params: [{ name: "pattern", value: ruleParams.Pattern },
119                             { name: "options", value: typeof (ruleParams.Options) == 'undefined' ? "" : ruleParams.Options}],
120                    errorMessage: fixedErrorText || "Please enter a valid value."
121                };
122            case "StringLength":
123                var min = typeof (ruleParams.MinLength) == 'undefined' ? null : ruleParams.MinLength;
124                var max = typeof (ruleParams.MaxLength) == 'undefined' ? null : ruleParams.MaxLength;
125                var pattern = "^.{" + (min || "0") + "," + (max || "") + "}$";
126                var message;
127                if (min != null) {
128                    if (max != null)
129                        message = "Please enter a value between " + min + " and " + max + " characters long.";
130                    else
131                        message = "Please enter a value at least " + min + " characters long.";
132                }
133                else
134                    message = "Please enter a value no more than " + max + " characters long.";
135
136                return {
137                    evaluationFunction: "xVal_AspNetNative_RegEx",
138                    params: [{ name: "pattern", value: pattern },
139                             { name: "options", value: ""}],
140                    errorMessage: fixedErrorText || message
141                };
142
143            case "DataType":
144                if (ruleParams.Type == "CreditCardLuhn") {
145                    return {
146                        evaluationFunction: "xVal_AspNetNative_CreditCardLuhn",
147                        params: [],
148                        errorMessage: fixedErrorText || "Please enter a valid credit card number."
149                    };
150                }
151
152                var pattern, message;
153                switch (ruleParams.Type) {
154                    case "EmailAddress":
155                        pattern = "^[\\w\\.=-]+@[\\w\\.-]+\\.[\\w]{2,}$";
156                        message = "Please enter a valid email address.";
157                        break;
158                    case "Integer":
159                        pattern = "^\\-?\\d+$";
160                        message = "Please enter a number.";
161                        break;
162                    case "Decimal":
163                        pattern = "^\\-?\\d+(\\.\\d+)?$";
164                        message = "Please enter a decimal number.";
165                        break;
166                    case "Date":
167                        pattern = "^(\\d{1,2}[/\\-\\.\\s]\\d{1,2}[/\\-\\.\\s](\\d{2}|\\d{4}))|((\\d{2}|\\d{4})[/\\-\\.\\s]\\d{1,2}[/\\-\\.\\s]\\d{1,2})$";
168                        message = "Please enter a valid date.";
169                        break;
170                    case "DateTime":
171                        pattern = "^(\\d{1,2}[/\\-\\.\\s]\\d{1,2}[/\\-\\.\\s](\\d{2}|\\d{4}))|((\\d{2}|\\d{4})[/\\-\\.\\s]\\d{1,2}[/\\-\\.\\s]\\d{1,2})\\s+\\d{1,2}\\:\\d{2}(\\:\\d{2})?$";
172                        message = "Please enter a valid date and time.";
173                        break;
174                    case "Currency":
175                        pattern = "^\\-?\\D?\\s?\\-?\\s?([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)(.[0-9][0-9])?$";
176                        message = "Please enter a currency value.";
177                        break;
178                }
179                return {
180                    evaluationFunction: "xVal_AspNetNative_RegEx",
181                    params: [{ name: "pattern", value: pattern },
182                             { name: "options", value: "i"}],
183                    errorMessage: fixedErrorText || message
184                };
185        }
186        return null;
187    },
188
189    _hideElementOnChange: function(elementToWatch, elementToHide) {
190        var handler = function() { elementToHide.style.display = "none"; };
191        if (elementToWatch.addEventListener)
192            elementToWatch.addEventListener('change', handler, false);
193        else
194            elementToWatch.attachEvent('onchange', handler);
195    },
196
197    _createMessageContainer: function(element, initialText) {
198        // Is there an existing message container with htmlfor="elementid"?
199        // If so, we'll put the messages next to it
200        var insertAfterElem = element;
201        var spans = document.getElementsByTagName("SPAN");
202        for (var i = 0; i < spans.length; i++) {
203            if (spans[i].getAttribute("htmlfor") == element.id) {
204                insertAfterElem = spans[i];
205                this._hideElementOnChange(element, insertAfterElem);
206                break;
207            }
208        }
209
210        var result = document.createElement("span");
211        result.id = element.id + "_Msg";
212        result.innerHTML = initialText;
213        result.style.color = "Red";
214        result.style.display = "none";
215        if (insertAfterElem.nextSibling)
216            insertAfterElem.parentNode.insertBefore(result, insertAfterElem.nextSibling);
217        else
218            insertAfterElem.parentNode.appendChild(result);
219        return result;
220    },
221
222    _ensureValidationEnabledOnForm: function(formElement) {
223        if (!formElement._xVal_ValidationEnabledOnForm) {
224            formElement._xVal_ValidationEnabledOnForm = true;
225
226            formElement.onsubmit = function() {
227                return (Page_ValidationActive ? ValidatorCommonOnSubmit() : false);
228            };
229
230            var inputControls = formElement.getElementsByTagName("INPUT");
231            for (var i = 0; i < inputControls.length; i++) {
232                if (inputControls[i].type && (inputControls[i].type.toLowerCase() == 'submit')) {
233                    inputControls[i].onclick = function() {
234                        WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(this.name || this.id || "", "", true, "", "", false, false));
235                    };
236                }
237            }
238        }
239    }
240};
241
242function xVal_AspNetNative_RegEx(val) {
243    var value = ValidatorGetValue(val.controltovalidate);
244    if (ValidatorTrim(value).length == 0)
245        return true;
246    var regex = val.options == "" ? new RegExp(val.pattern) : new RegExp(val.pattern, val.options);
247    return regex.test(value);
248}
249
250function xVal_AspNetNative_Range_DateTime(val) {
251    var value = ValidatorGetValue(val.controltovalidate);
252    if (ValidatorTrim(value).length == 0)
253        return true;
254    var min = val.minimumvalue;
255    var max = val.maximumvalue;
256
257    var parsedValue = Date.parse(value);
258    if (isNaN(parsedValue))
259        return false;
260    else
261        parsedValue = new Date(parsedValue);
262    if (min != null)
263        if (parsedValue < min) return false;
264    if (max != null)
265        if (parsedValue > max) return false;
266    return true;
267}
268
269function xVal_AspNetNative_CreditCardLuhn(val) {
270    var value = ValidatorGetValue(val.controltovalidate);
271    if (ValidatorTrim(value).length == 0)
272        return true;
273    value = value.replace(/\D/g, "");
274    if (value == "") return false;
275    var sum = 0;
276    for (var i = value.length - 2; i >= 0; i -= 2)
277        sum += Array(0, 2, 4, 6, 8, 1, 3, 5, 7, 9)[parseInt(value.charAt(i), 10)];
278    for (var i = value.length - 1; i >= 0; i -= 2)
279        sum += parseInt(value.charAt(i), 10);
280    return (sum % 10) == 0;
281}
Notatka: Zobacz TracBrowser aby uzyskać więcej informacji.