New tests, updates
[mono.git] / mcs / class / System.Web / resources / WebUIValidation.js
index a3957d5a31bff4c1508b643a135bee3b223d6393..8948fc36a85e8c1ad2ecbadaddbb9a703058e7e7 100644 (file)
 
 var have_validation_summaries = false;
 
+function HaveRegexp ()
+{
+  if (window.RegExp)
+    return true;
+  return false;
+}
+
 function ValidatorOnLoad ()
 {
        if (typeof (Page_ValidationSummaries) != 'undefined' && Page_ValidationSummaries != null)
                have_validation_summaries = true;
 
-       for (var v in Page_Validators) {
+       for (var v = 0; v < Page_Validators.length; v++) {
                var vo = Page_Validators [v];
                var funcname = vo.getAttribute ("evaluationfunction");
 
@@ -95,7 +102,7 @@ function ValidatorCommonOnSubmit ()
 
                                html += header;
                                html += list_pre;
-                               for (var v in Page_Validators) {
+                               for (var v = 0; v < Page_Validators.length; v++) {
                                        var vo = Page_Validators [v];
 
                                        if (vo.getAttribute ("isvalid").toLowerCase() == "false") {
@@ -115,7 +122,7 @@ function ValidatorCommonOnSubmit ()
                        if (attr != null && attr.toLowerCase() == "true") {
                                var v_contents = "";
 
-                               for (var v in Page_Validators) {
+                               for (var v = 0; v < Page_Validators.length; v++) {
                                        var vo = Page_Validators [v];
 
                                        if (vo.getAttribute ("isvalid").toLowerCase() == "false") {
@@ -177,7 +184,7 @@ function Page_ClientValidate()
                }
        }
 
-       for (var v in Page_Validators) {
+       for (var v = 0; v < Page_Validators.length; v++) {
                var vo = Page_Validators [v];
                var evalfunc = vo["evaluationfunction"];
                var result = false;
@@ -202,7 +209,7 @@ function Page_ClientValidate()
 /*******************/
 /* type converters */
 
-function ToInteger (s)
+function ToInteger (s, validator)
 {
        if ((v = parseInt(s, 10)) != s - 0)
                return null;
@@ -210,12 +217,12 @@ function ToInteger (s)
                return v;
 }
 
-function ToString (s)
+function ToString (s, validator)
 {
        return s;
 }
 
-function ToDouble (s)
+function ToDouble (s, validator)
 {
        if ((v = parseFloat(s)) != s - 0)
                return null;
@@ -223,21 +230,129 @@ function ToDouble (s)
                return v;
 }
 
-function ToDate (s)
+function ToDate (s, validator)
 {
-       /* NYI */
-       return null;
+  if (!HaveRegexp ())
+        return null;
+    var m, day, month, year;
+    var yearFirstExp = new RegExp("^\\s*((\\d{4})|(\\d{2}))([-/]|\\. ?)(\\d{1,2})\\4(\\d{1,2})\\s*$");
+    m = s.match(yearFirstExp);
+    if (m != null && (m[2].length == 4 || validator.dateorder == "ymd")) {
+        day = m[6];
+        month = m[5];
+        year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10), validator.cutoffyear)
+    }
+    else {
+        if (validator.dateorder == "ymd") return null;
+        var yearLastExp = new RegExp("^\\s*(\\d{1,2})([-/]|\\. ?)(\\d{1,2})\\2((\\d{4})|(\\d{2}))\\s*$");
+        m = s.match(yearLastExp);
+        if (m == null) return null;
+        if (validator.dateorder == "mdy") {
+            day = m[3];
+            month = m[1];
+        }
+        else {
+            day = m[1];
+            month = m[3];
+        }
+        year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10), validator.cutoffyear)
+    }
+    month -= 1;
+    var date = new Date(year, month, day);
+    return (typeof(date) == "object" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate()) ? date.valueOf() : null;  
 }
 
 function ToCurrency (s)
 {
-       /* NYI */
-       return null;
+  if (!HaveRegexp ())
+    return null;
+  
+       var hasDigits = (validator.digits > 0);
+       var beginGroupSize, subsequentGroupSize;
+       var groupSizeNum = parseInt(validator.groupsize, 10);
+       if (!isNaN(groupSizeNum) && groupSizeNum > 0) {
+               beginGroupSize = "{1," + groupSizeNum + "}";
+               subsequentGroupSize = "{" + groupSizeNum + "}";
+       } else {
+               beginGroupSize = subsequentGroupSize = "+";
+       }
+       var exp = new RegExp("^\\s*([-\\+])?((\\d" + beginGroupSize + "(\\" + validator.groupchar + "\\d" + subsequentGroupSize + ")+)|\\d*)"
+                       + (hasDigits ? "\\" + validator.decimalchar + "?(\\d{0," + validator.digits + "})" : "")
+                       + "\\s*$");
+       var m = s.match(exp);
+       if (m == null)
+               return null;
+       if (m[2].length == 0 && hasDigits && m[5].length == 0)
+               return null;
+       var cleanInput = (m[1] != null ? m[1] : "") + m[2].replace(new RegExp("(\\" + validator.groupchar + ")", "g"), "") + ((hasDigits && m[5].length > 0) ? "." + m[5] : "");
+       var num = parseFloat(cleanInput);
+       return (isNaN(num) ? null : num);
+}
+
+function GetFullYear(year, maxYear)
+{
+    var twoDigitMaxYear = maxYear % 100;
+    var centure = maxYear - twoDigitMaxYear;
+    return ((year > twoDigitMaxYear) ? (centure - 100 + year) : (centure + year));
 }
 
 /*******************/
 /* validators    */
 
+function CompareValidatorEvaluateIsValid (validator)
+{
+       var ControlToCompare = validator.getAttribute ("controltocompare");
+       var ValueToCompare = validator.getAttribute ("valuetocompare");
+       var Operator = validator.getAttribute ("operator").toLowerCase();
+       var ControlToValidate = validator.getAttribute ("controltovalidate");
+       var DataType = validator.getAttribute ("datatype");
+
+       var ctrl_value = ValidatorTrim (ValidatorGetValue (ControlToValidate));
+       var compare = (ControlToCompare != null && ControlToCompare != "") ? ValidatorTrim (ValidatorGetValue (ControlToCompare)) : ValueToCompare;
+
+       var left = Convert (ctrl_value, DataType, validator);
+       if (left == null) {
+               ValidatorFailed (validator);
+               return false;
+       }
+      
+       var right = Convert (compare, DataType, validator);
+       if (right == null) {
+               ValidatorSucceeded (validator);
+                return true;
+       }
+
+       var result = false;
+   
+       if (Operator == "equal") {
+               result = (left == right);
+       }
+       else if (Operator == "notequal") {
+               result = (left != right);
+       }
+       else if (Operator == "lessthan") {
+               result = (left < right);
+       }
+       else if (Operator == "lessthanequal") {
+               result = (left <= right);
+       }
+       else if (Operator == "greaterthan") {
+               result = (left > right);
+       }
+       else if (Operator == "greaterthanequal") {
+               result = (left >= right);
+       }
+
+       if (result == false) {
+               ValidatorFailed (validator);
+               return false;
+       }
+       else {
+               ValidatorSucceeded (validator);
+               return true;
+       }
+}
+
 function RangeValidatorEvaluateIsValid (validator)
 {
        var MinimumValue = parseInt (validator.getAttribute ("minimumvalue"));
@@ -252,7 +367,7 @@ function RangeValidatorEvaluateIsValid (validator)
                return true;
        }
 
-       var val = Convert (ctrl_value, DataType);
+       var val = Convert (ctrl_value, DataType, validator);
        if (val == null || val < MinimumValue || val > MaximumValue) {
                ValidatorFailed (validator);
                return false;
@@ -275,9 +390,13 @@ function RegularExpressionValidatorEvaluateIsValid (validator)
                return true;
        }
 
+  if (!HaveRegexp ())
+    return false; // better fail than pass invalidated input to the
+                  // backend
+  
        var r = new RegExp (ValidationExpression);
        match = r.exec (ctrl_value);
-       if (match == null || match[0] == "") {
+       if (match == null || match[0] != ctrl_value) {
                ValidatorFailed (validator);
                return false;
        }
@@ -308,6 +427,12 @@ function CustomValidatorEvaluateIsValid (validator)
 {
        var InitialValue = validator.getAttribute ("initialvalue");
        var ControlToValidate = validator.getAttribute ("controltovalidate");
+
+       if (!ControlToValidate) {
+               ValidatorSucceeded (validator);
+               return true;
+       }
+
        var evaluationfunc = validator.getAttribute ("clientvalidationfunction");
 
        var ctrl_value = ValidatorTrim (ValidatorGetValue (ControlToValidate));
@@ -333,11 +458,11 @@ function CustomValidatorEvaluateIsValid (validator)
 /*********************/
 /* utility functions */
 
-function Convert (s, ty)
+function Convert (s, ty, validator)
 {
        var cvt = this ["To" + ty];
        if (typeof (cvt) == 'function')
-               return cvt (s);
+               return cvt (s, validator);
        else
                return null;
 }
@@ -389,7 +514,7 @@ function ValidatorSucceeded (v)
 {
        v.innerHTML = "";
 
-       ValidatorUpdateDisplay (v, false);
+       ValidatorUpdateDisplay (v, true);
 }
 
 function GetElement(id)