validator「validator中文教程」
antd form表单validator 校验(4.17) 输入框一直是红色解决方法
使用 antd 的 validator 方法时 用 antd 官方提供的示例会 导致输入框一直是红色
改用以下写法就好了

```
rules={[
{
validator: async function validator(_, value, callback) {
const res: any = await getCheckNumberUnique(value);//异步发送接口 给 后端进行校验
if (res res.data res.data.code === 500) {
throw new Error('地图编号重复');//错误信息
} else {
callback();//恢复为蓝色框
}
},
},
]}
```
如何使用Validator框架
Validator框架是一个独立的Validation Framework,目前在Struts1.1中可以一起打包下载。作为Apache Commom的一个OpenSource,它可以和Struts一起结合使用,也可以和其他非Web应用中使用。前段时间利用Eclipse3.02 + MyEclipse3.8.4结合Xdoclet开发了一个EJB + Struts的Web应用,发现采用这些工具开发效率还是比较高的。MyEclipse通过xdoclet生成CMP ejb的时候会自动创建对应的Value Object类,结合struts框架时,可以把这Value Object结合Struts中的Form采用Composite模式,采用委托的方式来实现ActionForm。这些在Eclipse IDE中实现非常快速。但也存在一些问题,当JSP页面中的FORM中的数据通过Struts中的Form进入到对应的Value Object之前需要进行数据合法性校验,而这种校验在一个企业级Web应用中会存在大量的重复冗余代码,造成大量的重复工作和维护的工作量。
Validator是一个独立于表现和业务逻辑的一个FrameWork,它通过预定义一组校验规则以及提供了一套简单的扩展机制,让程序员可以自由的定义自己复杂的校验规则。规则与规则可以是相互依赖的,也可以是独立的。
下面使用一个登录的例子简单谈谈如何让Validator框架与Struts框架进行整合,从而把数据校验独立出来,使得大部分的校验规则得到重用,并且使得校验方法可配置化和易于维护。
1、准备配置文件
这里要用到两个xml文件,validator-rules.xml和validation.xml,前者用于定义校验器,在validator框架中已经预定义了十几个常用的校验器的实现;后者用于定义和Struts框架中具体的Form相关联的各个字段的校验,这两个文件放置在/WEB-INF/目录下面。
2、准备Struts的Form和Action
定义一个Form,这个Form从ValidatorFrom继承而来(缺省从ActionForm继承),具体的代码如下:
//Created by MyEclipse Struts
// XSL source (default): platform:/plugin/com.genuitec.eclipse.cross.easystruts.eclipse_3.8.4/xslt/JavaClass.xsl
package com.test.struts.form;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.validator.ValidatorForm;
/**
* MyEclipse Struts
* Creation date: 06-19-2005
*
* XDoclet definition:
* @struts:form name="logonForm"
*/
public class LogonForm extends ValidatorForm {
private String memberID;
private String password;
/**
* Method reset
* @param mapping
* @param request
*/
public void reset(ActionMapping mapping, HttpServletRequest request) {
memberID = null;
password = null;
}
/**
* @return Returns the memberID.
*/
public String getMemberID() {
return memberID;
}
/**
* @param memberID The memberID to set.
*/
public void setMemberID(String memberID) {
this.memberID = memberID;
}
/**
* @return Returns the password.
*/
public String getPassword() {
return password;
}
/**
* @param password The password to set.
*/
public void setPassword(String password) {
this.password = password;
}
}
定义一个Action,具体的代码如下所示:
//Created by MyEclipse Struts
// XSL source (default): platform:/plugin/com.genuitec.eclipse.cross.easystruts.eclipse_3.8.4/xslt/JavaClass.xsl
package com.test.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.test.struts.form.LogonForm;
/**
* MyEclipse Struts
* Creation date: 06-19-2005
*
* XDoclet definition:
* @struts:action path="/logon" name="logonForm" input="/jsp/logon.jsp" scope="request" validate="true"
*/
public class LogonAction extends Action {
/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
LogonForm logonForm = (LogonForm) form;
return mapping.findForward("success");
}
}
FormBean和Action在struts-config.xml中的配置如下所示:
form-beans
form-bean name="logonForm" type="com.test.struts.form.LogonForm" / /form-beans
action-mappings
action
attribute="logonForm"
input="/jsp/logon.jsp"
name="logonForm"
path="/logon"
scope="request"
validate="true"
type="com.test.struts.action.LogonAction"
forward name="success" path="/jsp/success.jsp"/
/action
/action-mappings
注意:在action元素中的validate属性必需设置为true。
3、配置validator-rules.xml和validation.xml文件
validator-rules.xml用于配置校验器,这个文件基本上可以重用。validation.xml用于配置与具体的Form Bean有关的校验配置。
validator-rules.xml
form-validation
global
validator name="required"
classname="org.apache.struts.validator.FieldChecks"
method="validateRequired"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionErrors,
javax.servlet.http.HttpServletRequest"
msg="errors.required"
......
/global
/form-validation
Validation.xml
form-validation
!-- ========== Default Language Form Definitions ===================== --
formset
form name="logonForm"
field property="memberID"
depends="required,short, minlength,maxlength"
arg0 key="prompt.memberID"/
arg1 key="${var:minlength}" name="minlength"
resource="false"/
arg2 key="${var:maxlength}" name="maxlength"
resource="false"/
var
var-namemaxlength/var-name
var-value16/var-value
/var
var
var-nameminlength/var-name
var-value3/var-value
/var
/field
field property="password"
depends="required, minlength,maxlength"
arg0 key="prompt.password"/
arg1 key="${var:minlength}" name="minlength"
resource="false"/
arg2 key="${var:maxlength}" name="maxlength"
resource="false"/
var
var-namemaxlength/var-name
var-value16/var-value
/var
var
var-nameminlength/var-name
var-value3/var-value
/var
/field
/form
/formset
/form-validation
4、定义资源文件ApplicationResources.properties
首先,资源文件必须要在struts-config.xml文件中进行定义:
message-resources parameter="com.test.struts.ApplicationResources" /
下面是资源文件中的内容,它主要关联到:
validator-rules.xml文件中validator元素中的msg属性;
validation.xml中field元素中作为参数传递给validator框架的arg0 -- arg3。
# Resources for parameter 'com.test.struts.ApplicationResources'
# Project P/ValidatorWeb
errors.header=span class="error-header1"Errors:/spanbrspan class="error-header2"You must correct the following error(s) before processing./spanul
errors.footer=/ul
errors.prefix=lispan class="error-text"
errors.suffix=/span/li
prompt.memberID=Member ID
prompt.password=Password
prompt.test=test
# Standard error messages for validator framework checks
errors.required={0} is required.
errors.minlength={0} cannot be less than {1} characters.
errors.maxlength={0} cannot be greater than {2} characters.
errors.invalid={0} is invalid.
errors.byte={0} must be an byte.
errors.short={0} must be an short.
errors.integer={0} must be an integer.
errors.long={0} must be an long.
errors.float={0} must be an float.
errors.double={0} must be an double.
errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is not a valid credit card number.
errors.email={0} is an invalid e-mail address.
5、在struts-config.xml中配置validator
必须在struts-config.xml中以plugin的方式指定validator的配置资源,这样,web应用在能够根据这些配置把各种校验器等资源加载到内存中。
plug-in className="org.apache.struts.validator.ValidatorPlugIn"
set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" /
/plug-in
6、在相关的JSP文件中通过Struts框架中的html标签制订相应的属性值
html:javascript dynamicJavascript="true"
formName="logonForm"
staticJavascript="false"/
这个标签用于在具体的jsp生成的客户端html页面中生成一段对应的javascript代码。
html:form action="/logon" focus="memberID"
onsubmit="return validateLogonForm(this);"
/html:form
用于当用户点击html:form中的submit按钮时,会执行相应的检查,如果检查没有通过,则不回去调用Action中的execute方法。
validator.validate 什么意思
validator validate
验证器验证
词典结果:
validator[英]['vɑlɪˌdeɪtə][美]['vɑlɪˌdeɪtə]
n.验证器;
以上结果来自金山词霸
例句:
1.
Css validator: adds an easy-to-use link to the w3c css validator that you can access via a right-click context menu or from under the tools menu.
css validator:提供到w3c css验证器的易用链接,你可以通过右键的上下文菜单或者工具菜单来进行访问。
简述验证控件的作用
现在asp.net,你不但可以轻松的实现对用户输入的验证,而且,还可以选择验证在服务器端进行还是在客户端进行,再也不必考虑那么多了,程序员们可以将重要精力放在主程序的设计上了。asp.net公有六种验证控件,分别如下:控件名
功能描叙
requiredfieldvalidator(必须字段验证)
用于检查是否有输入值
comparevalidator(比较验证)
按设定比较两个输入
rangevalidator(范围验证)
输入是否在指定范围
regularexpressionvalidator(正则表达式验证)
正则表达式验证控件
customvalidator(自定义验证)
自定义验证控件
validationsummary(验证总结)
总结验证结果
下面,我们来看这些控件的使用:一、requiredfieldvalidator(必须字段验证)的使用requiredfieldvalidator控件使用的标准代码如下:<asp:requiredfieldvalidator
id="validator_name"
runat="server"
controltovalidate="要检查的控件名"
errormessage="出错信息"
display="static|dymatic|none"
>
占位符
</asp:
requiredfieldvalidator
>在以上标准代码中:
controltovalidate:表示要进行检查控件id;
errormessage:表示当检查不合法时,出现的错误信息;
display:错误信息的显示方式;static表示控件的错误信息在页面中占有肯定位置;dymatic表示控件错误信息出现时才占用页面控件;none表示错误出现时不显示,但是可以在validatorsummary中显示;
占位符:表示display为static时,错误信息占有"占位符"那么大的页面空间;现在,让我们看一个实例:
<asp:textbox
id="txtname"
runat="server"/>
<asp:requiredfieldvalidator
id="validator1"
runat="server"
controltovalidate="txtname"
errormessage="姓名必须输入"
display="static">
*姓名必须输入
</asp:requiredfieldvalidator>在以上例子中,检查txtname控件是否有输入,如果没有,显示错误信息"姓名必须输入"。是不是很简单?
注意:以上代码和下面其他控件的代码最好放入form中,和asp中不一样的是,form最好写为这样:
<form
runat="server">
其他代码
</form>
这样,form在服务器端执行,提交才会有效;二、comparevalidator(比较验证)控件比较控件比较两个控件的输入是否符合程序设定,大家不要把比较仅仅理解为"相等",尽管相等是用的最多的,其实,这里的比较包括范围很广,大家看标准代码就会明白。比较控件的标准代码如下:
<asp:comparevalidator
id="validator_id"
runat="server"
controltovalidate="要验证的控件id"
errormessage="错误信息"
controltocompare="要比较的控件id"
type="string|integer|double|datetime|currency"
operator="equal|notequal|greaterthan|greatertanequal|lessthan|lessthanequal|datatypecheck"
display="static|dymatic|none"
>
占位符
</asp:comparevalidator>在以上标准代码中:
type表示要比较的控件的数据类型;
operator表示比较操作(也就是刚才说的为什么比较不仅仅是"相等"的原因),这里,比较有7种方式;
其他属性和requiredfieldvalidator相同;
在这里,要注意controltovalidate和controltocompare的区别,如果operate为greatethan,那么,必须controltocompare大于controltovalidate才是合法的,这下,应该明白它们两者的意义了吧?例子程序请参考requiredfieldvalidator控件,对照标准代码自己设计。三、rangevalidator(范围验证)控件验证输入是否在一定范围,范围用maximumvalue(最大)和minimunvlaue来确定,标准代码如下:<asp:rangevalidator
id="vaidator_id"
runat="server"
controltovalidate="要验证的控件id"
type="integer"
minimumvalue="最小值"
maximumvalue="最大值"
errormessage="错误信息"
display="static|dymatic|none"
>
占位符
</asp:rangevalidator>在以上代码中:
用minimumvalue和maximumvalue来界定控件输入值得范围,用type来定义控件输入值的类型。四、regularexpresionvalidator(正则表达式)控件正则表达式验证控件的功能非常强大,你可以自己容易构造验证方式,我们先来看看标准代码:<asp:regularexpressionvalidator
id="validator_id"
runat="server"
controltovalidate="要验证控件名"
validationexpression="正则表达式"
errormessage="错误信息"
display="static"
>
占位符
</asp:regularexpressionvalidator>在以上标准代码中,validationexpression是重点,现在来看看它的构造:
在validationexpression中,不同的字符表示不同的含义:
"."表示任意字符;
"*"表示和其他表达式一起,表示容易组合;
"[a-z]"表示任意大写字母;
"\d"表示容易一个数字;
注意,在以上表达式中,引号不包括在内;
举例:
正则表达式:".*[a-z]"表示数字开头的任意字符组合其后接一个大写字母。五、validationsummary(验证总结)控件该控件收集本页的所有验证错误信息,并可以将它们组织以后再显示出来。其标准代码如下:<asp:validationsummary
id="validator_id"
runat="server"
headertext="头信息"
showsummary="true|false"
diaplaymode="list|bulletlist|singleparagraph"
>
</asp:
validationsummary
>
在以上标准代码中,headtext相当于表的headtext,displaymode表示错误信息显示方式:list相当于html中的<br>;bulletlist相当于html中的<li>;singleparegraph表示错误信息之间不作如何分割;六、customvalidator(自定义验证)控件该控件用自定义的函数界定验证方式,其标准代码如下:<asp:customvalidator
id="validator_id"
runat="server"
controltovalidate="要验证的控件"
onservervalidatefunction="验证函数"
errormessage="错误信息"
display="static|dymatic|none"
>
占位符
</asp:
customvalidator
>以上代码中,用户必须定义一个函数来验证输入。
Validator怎么用
你看看这个例子吧:
title表单验证类 Validator v1.01/title
style
body,td{font:normal 12px Verdana;color:#333333}
input,textarea,select,td{font:normal 12px Verdana;color:#333333;border:1px solid #999999;background:#ffffff}
table{border-collapse:collapse;}
td{padding:3px}
input{height:20;}
textarea{width:80%;height:50px;overfmin:auto;}
form{display:inline}
/style
table align="center"
form name="theForm" id="demo" action="" method="get" onSubmit="return Validator.Validate(this,2)"
tr
td真实姓名:/tdtdinput name="Name" dataType="Chinese" msg="真实姓名只允许中文"/td
/tr
tr
td英文名:/tdtdinput name="Nick" dataType="English" require="false" msg="英文名只允许英文字母"/td
/tr
tr
td主页:/tdtdinput name="Homepage" require="false" dataType="Url" msg="非法的Url"/td
/tr
tr
td密码:/tdtdinput name="Password" dataType="SafeString" msg="密码不符合安全规则" type="password"/td
/tr
tr
td重复:/tdtdinput name="Repeat" dataType="Repeat" to="Password" msg="两次输入的密码不一致" type="password"/td
/tr
tr
td信箱:/tdtdinput name="Email" dataType="Email" msg="信箱格式不正确"/td
/tr
tr
td信箱:/tdtdinput name="Email" dataType="Repeat" to="Email" msg="两次输入的信箱不一致"/td
/tr
tr
tdQQ:/tdtdinput name="QQ" require="false" dataType="QQ" msg="QQ号码不存在"/td
/tr
tr
td身份证:/tdtdinput name="Card" dataType="IdCard" msg="身份证号码不正确"/td
/tr
tr
td年龄:/tdtdinput name="Year" dataType="Range" msg="年龄必须在18~28之间" min="18" max="28"/td
/tr
tr
td年龄1:/tdtdinput name="Year1" require="false" dataType="Compare" msg="年龄必须在18以上" to="18" operator="GreaterThanEqual"/td
/tr
tr
td**:/tdtdinput name="Phone" require="false" dataType="Phone" msg="**号码不正确"/td
/tr
tr
td手机:/tdtdinput name="Mobile" require="false" dataType="Mobile" msg="手机号码不正确"/td
/tr
tr
td生日:/tdtdinput name="Birthday" dataType="Date" format="ymd" msg="生日日期不存在"/td
/tr
tr
td邮政编码:/tdtdinput name="Zip" dataType="Custom" regexp="^[1-9]\d{5}$" msg="邮政编码不存在"/td
/tr
tr
td邮政编码:/tdtdinput name="Zip1" dataType="Zip" msg="邮政编码不存在"/td
/tr
tr
td操作系统:/tdtdselect name="Operation" dataType="Require" msg="未选择所用操作系统" option value=""选择您所用的操作系统/optionoption value="Win98"Win98/optionoption value="Win2k"Win2k/optionoption value="WinXP"WinXP/option/select/td
/tr
tr
td所在省份:/tdtd广东input name="Province" value="1" type="radio"陕西input name="Province" value="2" type="radio"浙江input name="Province" value="3" type="radio"江西input name="Province" value="4" type="radio" dataType="Group" msg="必须选定一个省份" /td
/tr
tr
td爱好:/tdtd运动input name="Favorite" value="1" type="checkbox"上网input name="Favorite" value="2" type="checkbox"听音乐input name="Favorite" value="3" type="checkbox"看书input name="Favorite" value="4" type="checkbox"" dataType="Group" min="2" max="3" msg="必须选择2~3种爱好"/td
/tr
td自我介绍:/tdtdtextarea name="Description" dataType="Limit" max="10" msg="自我介绍内容必须在10个字之内"中文是一个字/textarea/td
/tr
td自传:/tdtdtextarea name="History" dataType="LimitB" min="3" max="10" msg="自传内容必须在[3,10]个字节之内"中文是两个字节t/textarea/td
/tr
tr
td colspan="2"input name="Submit" type="submit" value="确定提交"input onClick="Validator.Validate(document.getElementById('demo'))" value="检验模式1" type="button"input onClick="Validator.Validate(document.getElementById('demo'),2)" value="检验模式2" type="button"input onClick="Validator.Validate(document.getElementById('demo'),3)" value="检验模式3" type="button"/td
/tr
/form
/table
script
Validator = {
Require : /.+/,
Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
Phone : /^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/,
Mobile : /^((\(\d{3}\))|(\d{3}\-))?13\d{9}$/,
Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-_~`@[\]\':+!]*([^\"\"])*$/,
IdCard : /^\d{15}(\d{2}[A-Za-z0-9])?$/,
Currency : /^\d+(\.\d+)?$/,
Number : /^\d+$/,
Zip : /^[1-9]\d{5}$/,
QQ : /^[1-9]\d{4,8}$/,
Integer : /^[-\+]?\d+$/,
Double : /^[-\+]?\d+(\.\d+)?$/,
English : /^[A-Za-z]+$/,
Chinese : /^[\u0391-\uFFE5]+$/,
UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^\*\.\(\)\[\]\{\}\?\\\/\'\"]*)|.{0,5})$|\s/,
IsSafe : function(str){return !this.UnSafe.test(str);},
SafeString : "this.IsSafe(value)",
Limit : "this.limit(value.length,getAttribute('min'), getAttribute('max'))",
LimitB : "this.limit(this.LenB(value), getAttribute('min'), getAttribute('max'))",
Date : "this.IsDate(value, getAttribute('min'), getAttribute('format'))",
Repeat : "value == document.getElementsByName(getAttribute('to'))[0].value",
Range : "getAttribute('min') value value getAttribute('max')",
Compare : "this.compare(value,getAttribute('operator'),getAttribute('to'))",
Custom : "this.Exec(value, getAttribute('regexp'))",
Group : "this.MustChecked(getAttribute('name'), getAttribute('min'), getAttribute('max'))",
ErrorItem : [document.forms[0]],
ErrorMessage : ["以下原因导致提交失败:\t\t\t\t"],
Validate : function(theForm, mode){
var obj = theForm || event.srcElement;
var count = obj.elements.length;
this.ErrorMessage.length = 1;
this.ErrorItem.length = 1;
this.ErrorItem[0] = obj;
for(var i=0;icount;i++){
with(obj.elements[i]){
var _dataType = getAttribute("dataType");
if(typeof(_dataType) == "object" || typeof(this[_dataType]) == "undefined") continue;
this.ClearState(obj.elements[i]);
if(getAttribute("require") == "false" value == "") continue;
switch(_dataType){
case "Date" :
case "Repeat" :
case "Range" :
case "Compare" :
case "Custom" :
case "Group" :
case "Limit" :
case "LimitB" :
case "SafeString" :
if(!eval(this[_dataType])) {
this.AddError(i, getAttribute("msg"));
}
break;
default :
if(!this[_dataType].test(value)){
this.AddError(i, getAttribute("msg"));
}
break;
}
}
}
if(this.ErrorMessage.length 1){
mode = mode || 1;
var errCount = this.ErrorItem.length;
switch(mode){
case 2 :
for(var i=1;ierrCount;i++)
this.ErrorItem[i].style.color = "red";
case 1 :
alert(this.ErrorMessage.join("\n"));
this.ErrorItem[1].focus();
break;
case 3 :
for(var i=1;ierrCount;i++){
try{
var span = document.createElement("SPAN");
span.id = "__ErrorMessagePanel";
span.style.color = "red";
this.ErrorItem[i].parentNode.appendChild(span);
span.innerHTML = this.ErrorMessage[i].replace(/\d+:/,"*");
}
catch(e){alert(e.description);}
}
this.ErrorItem[1].focus();
break;
default :
alert(this.ErrorMessage.join("\n"));
break;
}
return false;
}
return true;
},
limit : function(len,min, max){
min = min || 0;
max = max || Number.MAX_VALUE;
return min = len len = max;
},
LenB : function(str){
return str.replace(/[^\x00-\xff]/g,"**").length;
},
ClearState : function(elem){
with(elem){
if(style.color == "red")
style.color = "";
var lastNode = parentNode.childNodes[parentNode.childNodes.length-1];
if(lastNode.id == "__ErrorMessagePanel")
parentNode.removeChild(lastNode);
}
},
AddError : function(index, str){
this.ErrorItem[this.ErrorItem.length] = this.ErrorItem[0].elements[index];
this.ErrorMessage[this.ErrorMessage.length] = this.ErrorMessage.length + ":" + str;
},
Exec : function(op, reg){
return new RegExp(reg,"g").test(op);
},
compare : function(op1,operator,op2){
switch (operator) {
case "NotEqual":
return (op1 != op2);
case "GreaterThan":
return (op1 op2);
case "GreaterThanEqual":
return (op1 = op2);
case "LessThan":
return (op1 op2);
case "LessThanEqual":
return (op1 = op2);
default:
return (op1 == op2);
}
},
MustChecked : function(name, min, max){
var groups = document.getElementsByName(name);
var hasChecked = 0;
min = min || 1;
max = max || groups.length;
for(var i=groups.length-1;i=0;i--)
if(groups[i].checked) hasChecked++;
return min = hasChecked hasChecked = max;
},
IsDate : function(op, formatString){
formatString = formatString || "ymd";
var m, year, month, day;
switch(formatString){
case "ymd" :
m = op.match(new RegExp("^((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})$"));
if(m == null ) return false;
day = m[6];
month = m[5]--;
year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));
break;
case "dmy" :
m = op.match(new RegExp("^(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))$"));
if(m == null ) return false;
day = m[1];
month = m[3]--;
year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10));
break;
default :
break;
}
if(!parseInt(month)) return false;
month = month==12 ?0:month;
var date = new Date(year, month, day);
return (typeof(date) == "object" year == date.getFullYear() month == date.getMonth() day == date.getDate());
function GetFullYear(y){return ((y30 ? "20" : "19") + y)|0;}
}
}
/script

