| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296 | 
							- require({cache:{
 
- 'url:dijit/form/templates/ValidationTextBox.html':"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\" role=\"presentation\"\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"Χ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class=\"dijitReset dijitInputInner\" data-dojo-attach-point='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"}});
 
- define("dijit/form/ValidationTextBox", [
 
- 	"dojo/_base/declare", // declare
 
- 	"dojo/i18n", // i18n.getLocalization
 
- 	"./TextBox",
 
- 	"../Tooltip",
 
- 	"dojo/text!./templates/ValidationTextBox.html",
 
- 	"dojo/i18n!./nls/validate"
 
- ], function(declare, i18n, TextBox, Tooltip, template){
 
- /*=====
 
- 	var Tooltip = dijit.Tooltip;
 
- 	var TextBox = dijit.form.TextBox;
 
- =====*/
 
- 	// module:
 
- 	//		dijit/form/ValidationTextBox
 
- 	// summary:
 
- 	//		Base class for textbox widgets with the ability to validate content of various types and provide user feedback.
 
- 	/*=====
 
- 		dijit.form.ValidationTextBox.__Constraints = function(){
 
- 			// locale: String
 
- 			//		locale used for validation, picks up value from this widget's lang attribute
 
- 			// _flags_: anything
 
- 			//		various flags passed to regExpGen function
 
- 			this.locale = "";
 
- 			this._flags_ = "";
 
- 		}
 
- 	=====*/
 
- 	return declare("dijit.form.ValidationTextBox", TextBox, {
 
- 		// summary:
 
- 		//		Base class for textbox widgets with the ability to validate content of various types and provide user feedback.
 
- 		// tags:
 
- 		//		protected
 
- 		templateString: template,
 
- 		baseClass: "dijitTextBox dijitValidationTextBox",
 
- 		// required: Boolean
 
- 		//		User is required to enter data into this field.
 
- 		required: false,
 
- 		// promptMessage: String
 
- 		//		If defined, display this hint string immediately on focus to the textbox, if empty.
 
- 		//		Also displays if the textbox value is Incomplete (not yet valid but will be with additional input).
 
- 		//		Think of this like a tooltip that tells the user what to do, not an error message
 
- 		//		that tells the user what they've done wrong.
 
- 		//
 
- 		//		Message disappears when user starts typing.
 
- 		promptMessage: "",
 
- 		// invalidMessage: String
 
- 		// 		The message to display if value is invalid.
 
- 		//		The translated string value is read from the message file by default.
 
- 		// 		Set to "" to use the promptMessage instead.
 
- 		invalidMessage: "$_unset_$",
 
- 		// missingMessage: String
 
- 		// 		The message to display if value is empty and the field is required.
 
- 		//		The translated string value is read from the message file by default.
 
- 		// 		Set to "" to use the invalidMessage instead.
 
- 		missingMessage: "$_unset_$",
 
- 		// message: String
 
- 		//		Currently error/prompt message.
 
- 		//		When using the default tooltip implementation, this will only be
 
- 		//		displayed when the field is focused.
 
- 		message: "",
 
- 		// constraints: dijit.form.ValidationTextBox.__Constraints
 
- 		//		user-defined object needed to pass parameters to the validator functions
 
- 		constraints: {},
 
- 		// regExp: [extension protected] String
 
- 		//		regular expression string used to validate the input
 
- 		//		Do not specify both regExp and regExpGen
 
- 		regExp: ".*",
 
- 		regExpGen: function(/*dijit.form.ValidationTextBox.__Constraints*/ /*===== constraints =====*/){
 
- 			// summary:
 
- 			//		Overridable function used to generate regExp when dependent on constraints.
 
- 			//		Do not specify both regExp and regExpGen.
 
- 			// tags:
 
- 			//		extension protected
 
- 			return this.regExp; // String
 
- 		},
 
- 		// state: [readonly] String
 
- 		//		Shows current state (ie, validation result) of input (""=Normal, Incomplete, or Error)
 
- 		state: "",
 
- 		// tooltipPosition: String[]
 
- 		//		See description of `dijit.Tooltip.defaultPosition` for details on this parameter.
 
- 		tooltipPosition: [],
 
- 		_setValueAttr: function(){
 
- 			// summary:
 
- 			//		Hook so set('value', ...) works.
 
- 			this.inherited(arguments);
 
- 			this.validate(this.focused);
 
- 		},
 
- 		validator: function(/*anything*/ value, /*dijit.form.ValidationTextBox.__Constraints*/ constraints){
 
- 			// summary:
 
- 			//		Overridable function used to validate the text input against the regular expression.
 
- 			// tags:
 
- 			//		protected
 
- 			return (new RegExp("^(?:" + this.regExpGen(constraints) + ")"+(this.required?"":"?")+"$")).test(value) &&
 
- 				(!this.required || !this._isEmpty(value)) &&
 
- 				(this._isEmpty(value) || this.parse(value, constraints) !== undefined); // Boolean
 
- 		},
 
- 		_isValidSubset: function(){
 
- 			// summary:
 
- 			//		Returns true if the value is either already valid or could be made valid by appending characters.
 
- 			//		This is used for validation while the user [may be] still typing.
 
- 			return this.textbox.value.search(this._partialre) == 0;
 
- 		},
 
- 		isValid: function(/*Boolean*/ /*===== isFocused =====*/){
 
- 			// summary:
 
- 			//		Tests if value is valid.
 
- 			//		Can override with your own routine in a subclass.
 
- 			// tags:
 
- 			//		protected
 
- 			return this.validator(this.textbox.value, this.constraints);
 
- 		},
 
- 		_isEmpty: function(value){
 
- 			// summary:
 
- 			//		Checks for whitespace
 
- 			return (this.trim ? /^\s*$/ : /^$/).test(value); // Boolean
 
- 		},
 
- 		getErrorMessage: function(/*Boolean*/ /*===== isFocused =====*/){
 
- 			// summary:
 
- 			//		Return an error message to show if appropriate
 
- 			// tags:
 
- 			//		protected
 
- 			return (this.required && this._isEmpty(this.textbox.value)) ? this.missingMessage : this.invalidMessage; // String
 
- 		},
 
- 		getPromptMessage: function(/*Boolean*/ /*===== isFocused =====*/){
 
- 			// summary:
 
- 			//		Return a hint message to show when widget is first focused
 
- 			// tags:
 
- 			//		protected
 
- 			return this.promptMessage; // String
 
- 		},
 
- 		_maskValidSubsetError: true,
 
- 		validate: function(/*Boolean*/ isFocused){
 
- 			// summary:
 
- 			//		Called by oninit, onblur, and onkeypress.
 
- 			// description:
 
- 			//		Show missing or invalid messages if appropriate, and highlight textbox field.
 
- 			// tags:
 
- 			//		protected
 
- 			var message = "";
 
- 			var isValid = this.disabled || this.isValid(isFocused);
 
- 			if(isValid){ this._maskValidSubsetError = true; }
 
- 			var isEmpty = this._isEmpty(this.textbox.value);
 
- 			var isValidSubset = !isValid && isFocused && this._isValidSubset();
 
- 			this._set("state", isValid ? "" : (((((!this._hasBeenBlurred || isFocused) && isEmpty) || isValidSubset) && this._maskValidSubsetError) ? "Incomplete" : "Error"));
 
- 			this.focusNode.setAttribute("aria-invalid", isValid ? "false" : "true");
 
- 			if(this.state == "Error"){
 
- 				this._maskValidSubsetError = isFocused && isValidSubset; // we want the error to show up after a blur and refocus
 
- 				message = this.getErrorMessage(isFocused);
 
- 			}else if(this.state == "Incomplete"){
 
- 				message = this.getPromptMessage(isFocused); // show the prompt whenever the value is not yet complete
 
- 				this._maskValidSubsetError = !this._hasBeenBlurred || isFocused; // no Incomplete warnings while focused
 
- 			}else if(isEmpty){
 
- 				message = this.getPromptMessage(isFocused); // show the prompt whenever there's no error and no text
 
- 			}
 
- 			this.set("message", message);
 
- 			return isValid;
 
- 		},
 
- 		displayMessage: function(/*String*/ message){
 
- 			// summary:
 
- 			//		Overridable method to display validation errors/hints.
 
- 			//		By default uses a tooltip.
 
- 			// tags:
 
- 			//		extension
 
- 			if(message && this.focused){
 
- 				Tooltip.show(message, this.domNode, this.tooltipPosition, !this.isLeftToRight());
 
- 			}else{
 
- 				Tooltip.hide(this.domNode);
 
- 			}
 
- 		},
 
- 		_refreshState: function(){
 
- 			// Overrides TextBox._refreshState()
 
- 			this.validate(this.focused);
 
- 			this.inherited(arguments);
 
- 		},
 
- 		//////////// INITIALIZATION METHODS ///////////////////////////////////////
 
- 		constructor: function(){
 
- 			this.constraints = {};
 
- 		},
 
- 		_setConstraintsAttr: function(/*Object*/ constraints){
 
- 			if(!constraints.locale && this.lang){
 
- 				constraints.locale = this.lang;
 
- 			}
 
- 			this._set("constraints", constraints);
 
- 			this._computePartialRE();
 
- 		},
 
- 		_computePartialRE: function(){
 
- 			var p = this.regExpGen(this.constraints);
 
- 			this.regExp = p;
 
- 			var partialre = "";
 
- 			// parse the regexp and produce a new regexp that matches valid subsets
 
- 			// if the regexp is .* then there's no use in matching subsets since everything is valid
 
- 			if(p != ".*"){ this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g,
 
- 				function(re){
 
- 					switch(re.charAt(0)){
 
- 						case '{':
 
- 						case '+':
 
- 						case '?':
 
- 						case '*':
 
- 						case '^':
 
- 						case '$':
 
- 						case '|':
 
- 						case '(':
 
- 							partialre += re;
 
- 							break;
 
- 						case ")":
 
- 							partialre += "|$)";
 
- 							break;
 
- 						 default:
 
- 							partialre += "(?:"+re+"|$)";
 
- 							break;
 
- 					}
 
- 				}
 
- 			);}
 
- 			try{ // this is needed for now since the above regexp parsing needs more test verification
 
- 				"".search(partialre);
 
- 			}catch(e){ // should never be here unless the original RE is bad or the parsing is bad
 
- 				partialre = this.regExp;
 
- 				console.warn('RegExp error in ' + this.declaredClass + ': ' + this.regExp);
 
- 			} // should never be here unless the original RE is bad or the parsing is bad
 
- 			this._partialre = "^(?:" + partialre + ")$";
 
- 		},
 
- 		postMixInProperties: function(){
 
- 			this.inherited(arguments);
 
- 			this.messages = i18n.getLocalization("dijit.form", "validate", this.lang);
 
- 			if(this.invalidMessage == "$_unset_$"){ this.invalidMessage = this.messages.invalidMessage; }
 
- 			if(!this.invalidMessage){ this.invalidMessage = this.promptMessage; }
 
- 			if(this.missingMessage == "$_unset_$"){ this.missingMessage = this.messages.missingMessage; }
 
- 			if(!this.missingMessage){ this.missingMessage = this.invalidMessage; }
 
- 			this._setConstraintsAttr(this.constraints); // this needs to happen now (and later) due to codependency on _set*Attr calls attachPoints
 
- 		},
 
- 		_setDisabledAttr: function(/*Boolean*/ value){
 
- 			this.inherited(arguments);	// call FormValueWidget._setDisabledAttr()
 
- 			this._refreshState();
 
- 		},
 
- 		_setRequiredAttr: function(/*Boolean*/ value){
 
- 			this._set("required", value);
 
- 			this.focusNode.setAttribute("aria-required", value);
 
- 			this._refreshState();
 
- 		},
 
- 		_setMessageAttr: function(/*String*/ message){
 
- 			this._set("message", message);
 
- 			this.displayMessage(message);
 
- 		},
 
- 		reset:function(){
 
- 			// Overrides dijit.form.TextBox.reset() by also
 
- 			// hiding errors about partial matches
 
- 			this._maskValidSubsetError = true;
 
- 			this.inherited(arguments);
 
- 		},
 
- 		_onBlur: function(){
 
- 			// the message still exists but for back-compat, and to erase the tooltip
 
- 			// (if the message is being displayed as a tooltip), call displayMessage('')
 
- 			this.displayMessage('');
 
- 			this.inherited(arguments);
 
- 		}
 
- 	});
 
- });
 
 
  |