if (!dojo._hasResource["dijit.form.ValidationTextBox"]) { // _hasResource
// checks added by
// build. Do not use
// _hasResource
// directly in your
// code.
dojo._hasResource["dijit.form.ValidationTextBox"] = true;
dojo.provide("dijit.form.ValidationTextBox");
dojo.require("dojo.i18n");
dojo.require("dijit.form.TextBox");
dojo.require("dijit.Tooltip");
dojo.requireLocalization("dijit.form", "validate", null,
"ko,zh-cn,zh,ja,zh-tw,ru,it,hu,ROOT,fr,pt,pl,es,de,cs");
dojo.declare("dijit.form.ValidationTextBox", dijit.form.TextBox, {
// summary:
// A subclass of TextBox.
// Over-ride isValid in subclasses to perform specific kinds of
// validation.
templateString : "
\n",
baseClass : "dijitTextBox",
// default values for new subclass properties
// required: Boolean
// Can be true or false, default is false.
required : false,
// promptMessage: String
// Hint string
promptMessage : "",
// invalidMessage: String
// The message to display if value is invalid.
invalidMessage : "$_unset_$", // read from the message file if not
// overridden
// constraints: Object
// user-defined object needed to pass parameters to the validator
// functions
constraints : {},
// regExp: String
// regular expression string used to validate the input
// Do not specify both regExp and regExpGen
regExp : ".*",
// regExpGen: Function
// user replaceable function used to generate regExp when dependent on
// constraints
// Do not specify both regExp and regExpGen
regExpGen : function(constraints) {
return this.regExp;
},
// state: String
// Shows current state (ie, validation result) of input (Normal,
// Warning, or Error)
state : "",
setValue : function() {
this.inherited('setValue', arguments);
this.validate(false);
},
validator : function(value, constraints) {
// summary: user replaceable function used to validate the text
// input against the regular expression.
return (new RegExp("^(" + this.regExpGen(constraints) + ")"
+ (this.required ? "" : "?") + "$")).test(value)
&& (!this.required || !this._isEmpty(value))
&& (this._isEmpty(value) || this.parse(value, constraints) !== null);
},
isValid : function(/* Boolean */isFocused) {
// summary: Need to over-ride with your own validation code in
// subclasses
return this.validator(this.textbox.value, this.constraints);
},
_isEmpty : function(value) {
// summary: Checks for whitespace
return /^\s*$/.test(value); // Boolean
},
getErrorMessage : function(/* Boolean */isFocused) {
// summary: return an error message to show if appropriate
return this.invalidMessage;
},
getPromptMessage : function(/* Boolean */isFocused) {
// summary: return a hint to show if appropriate
return this.promptMessage;
},
validate : function(/* Boolean */isFocused) {
// summary:
// Called by oninit, onblur, and onkeypress.
// description:
// Show missing or invalid messages if appropriate, and highlight
// textbox field.
var message = "";
var isValid = this.isValid(isFocused);
var isEmpty = this._isEmpty(this.textbox.value);
this.state = (isValid || (!this._hasBeenBlurred && isEmpty))
? ""
: "Error";
this._setStateClass();
dijit.setWaiState(this.focusNode, "invalid", (isValid
? "false"
: "true"));
if (isFocused) {
if (isEmpty) {
message = this.getPromptMessage(true);
}
if (!message && !isValid) {
message = this.getErrorMessage(true);
}
}
this._displayMessage(message);
},
// currently displayed message
_message : "",
_displayMessage : function(/* String */message) {
if (this._message == message) {
return;
}
this._message = message;
this.displayMessage(message);
},
displayMessage : function(/* String */message) {
// summary:
// User overridable method to display validation errors/hints.
// By default uses a tooltip.
if (message) {
dijit.showTooltip(message, this.domNode);
} else {
dijit.hideTooltip(this.domNode);
}
},
_hasBeenBlurred : false,
_onBlur : function(evt) {
this._hasBeenBlurred = true;
this.validate(false);
this.inherited('_onBlur', arguments);
},
onfocus : function(evt) {
// TODO: change to _onFocus?
this.validate(true);
this._onMouse(evt); // update CSS classes
},
onkeyup : function(evt) {
this.onfocus(evt);
},
/*
* onkeyup: function(evt){ dojo.stopEvent(evt); //return;
* this.onfocus(evt); },
*
* _onKeyPress: function(evt){ dojo.stopEvent(evt); },
*/
// ////////// INITIALIZATION METHODS
// ///////////////////////////////////////
constructor : function() {
this.constraints = {};
},
postMixInProperties : function() {
this.inherited('postMixInProperties', arguments);
this.constraints.locale = this.lang;
this.messages = dojo.i18n.getLocalization("dijit.form", "validate",
this.lang);
if (this.invalidMessage == "$_unset_$") {
this.invalidMessage = this.messages.invalidMessage;
}
var p = this.regExpGen(this.constraints);
this.regExp = p;
// make value a string for all types so that form reset works well
}
});
dojo.declare("dijit.form.MappedTextBox", dijit.form.ValidationTextBox, {
// summary:
// A subclass of ValidationTextBox.
// Provides a hidden input field and a serialize method to
// override
serialize : function(val, /* Object? */options) {
// summary: user replaceable function used to convert the
// getValue() result to a String
return (val.toString ? val.toString() : "");
},
toString : function() {
// summary: display the widget as a printable string using
// the widget's value
var val = this.filter(this.getValue());
return (val != null) ? ((typeof val == "string")
? val
: this.serialize(val, this.constraints)) : "";
},
validate : function() {
this.valueNode.value = this.toString();
this.inherited('validate', arguments);
},
postCreate : function() {
var textbox = this.textbox;
var valueNode = (this.valueNode = document
.createElement("input"));
valueNode.setAttribute("type", textbox.type);
valueNode.setAttribute("value", this.toString());
dojo.style(valueNode, "display", "none");
valueNode.name = this.textbox.name;
this.textbox.name = "_" + this.textbox.name + "_displayed_";
this.textbox.removeAttribute("name");
dojo.place(valueNode, textbox, "after");
this.inherited('postCreate', arguments);
}
});
dojo.declare("dijit.form.RangeBoundTextBox", dijit.form.MappedTextBox, {
// summary:
// A subclass of MappedTextBox.
// Tests for a value out-of-range
/*
* ===== contraints object: // min: Number // Minimum signed value.
* Default is -Infinity min: undefined, // max: Number // Maximum signed
* value. Default is +Infinity max: undefined, =====
*/
// rangeMessage: String
// The message to display if value is out-of-range
rangeMessage : "",
compare : function(val1, val2) {
// summary: compare 2 values
return val1 - val2;
},
rangeCheck : function(/* Number */primitive, /* Object */constraints) {
// summary: user replaceable function used to validate the range of
// the numeric input value
var isMin = (typeof constraints.min != "undefined");
var isMax = (typeof constraints.max != "undefined");
if (isMin || isMax) {
return (!isMin || this.compare(primitive, constraints.min) >= 0)
&& (!isMax || this.compare(primitive, constraints.max) <= 0);
} else {
return true;
}
},
isInRange : function(/* Boolean */isFocused) {
// summary: Need to over-ride with your own validation code in
// subclasses
return this.rangeCheck(this.getValue(), this.constraints);
},
isValid : function(/* Boolean */isFocused) {
return this.inherited('isValid', arguments)
&& ((this._isEmpty(this.textbox.value) && !this.required) || this
.isInRange(isFocused));
},
getErrorMessage : function(/* Boolean */isFocused) {
if (dijit.form.RangeBoundTextBox.superclass.isValid.call(this,
false)
&& !this.isInRange(isFocused)) {
return this.rangeMessage;
} else {
return this.inherited('getErrorMessage', arguments);
}
},
postMixInProperties : function() {
this.inherited('postMixInProperties', arguments);
if (!this.rangeMessage) {
this.messages = dojo.i18n.getLocalization("dijit.form",
"validate", this.lang);
this.rangeMessage = this.messages.rangeMessage;
}
},
postCreate : function() {
this.inherited('postCreate', arguments);
if (typeof this.constraints.min != "undefined") {
dijit.setWaiState(this.focusNode, "valuemin",
this.constraints.min);
}
if (typeof this.constraints.max != "undefined") {
dijit.setWaiState(this.focusNode, "valuemax",
this.constraints.max);
}
}
});
}