//>>built
define("dojox/form/DateTextBox", [
	"dojo/_base/kernel",
	"dojo/_base/lang",
	"dojo/dom-style",
	"dojox/widget/Calendar",
	"dojox/widget/CalendarViews",
	"dijit/form/_DateTimeTextBox",
	"dijit/form/TextBox",
	"dojo/_base/declare"
], function(kernel, lang, domStyle, Calendar, CalendarViews, _DateTimeTextBox, TextBox, declare){
kernel.experimental("dojox.form.DateTextBox");

	/*=====
		_DateTimeTextBox = dijit.form._DateTimeTextBox;
	=====*/
var DateTextBox = declare( "dojox.form.DateTextBox", _DateTimeTextBox,
	{
		// summary:
		//		A validating, serializable, range-bound date text box with a popup calendar

		// popupClass: String
		//  The popup widget to use. In this case, a calendar with Day, Month and Year views.
		popupClass: "dojox.widget.Calendar",
		_selector: "date",

		openDropDown: function(){
			this.inherited(arguments);
			domStyle.set(this.dropDown.domNode.parentNode, "position", "absolute");
		}
	}
);


declare( "dojox.form.DayTextBox", DateTextBox,
	{
		// summary:
		//		A validating, serializable, range-bound date text box with a popup calendar that contains just months.

		// popupClass: String
		//  The popup widget to use. In this case, a calendar with just a Month view.
		popupClass: "dojox.widget.DailyCalendar",

		parse: function(displayVal){
			return displayVal;
		},

		format: function(value){
			return value.getDate ? value.getDate() : value;
		},
		validator: function(value){
			var num = Number(value);
			var isInt = /(^-?\d\d*$)/.test(String(value));
			return value == "" || value == null || (isInt && num >= 1 && num <= 31);
		},

		_setValueAttr: function(value, priorityChange, formattedValue){
			if(value){
				if(value.getDate){
					value = value.getDate();
				}
			}
			TextBox.prototype._setValueAttr.call(this, value, priorityChange, formattedValue);
		},

		openDropDown: function(){
			this.inherited(arguments);

			this.dropDown.onValueSelected = lang.hitch(this, function(value){
				this.focus(); // focus the textbox before the popup closes to avoid reopening the popup
				setTimeout(lang.hitch(this, "closeDropDown"), 1); // allow focus time to take

				TextBox.prototype._setValueAttr.call(this, String(value.getDate()), true, String(value.getDate()));
			});
		}
	}
);

declare( "dojox.form.MonthTextBox", DateTextBox,
	{
		// summary:
		//		A validating, serializable, range-bound date text box with a popup calendar that contains only years

		// popupClass: String
		//  The popup widget to use. In this case, a calendar with just a Year view.
		popupClass: "dojox.widget.MonthlyCalendar",

		selector: "date",

		postMixInProperties: function(){
			this.inherited(arguments);
			this.constraints.datePattern = "MM";
		},

		format: function(value){
			if(!value && value !== 0){
				return 1;
			}
			if(value.getMonth){
				return value.getMonth() + 1;
			}
			return Number(value) + 1;
		},

		parse: function(value, constraints){
			return Number(value) - 1;
		},

		serialize: function(value, constraints){
			return String(value);
		},

		validator: function(value){
			var num = Number(value);
			var isInt = /(^-?\d\d*$)/.test(String(value));
			return value == "" || value == null || (isInt && num >= 1 && num <= 12);
		},

		_setValueAttr: function(value, priorityChange, formattedValue){
			if(value){
				if(value.getMonth){
					value = value.getMonth();
				}
			}
			TextBox.prototype._setValueAttr.call(this, value, priorityChange, formattedValue);
		},

		openDropDown: function(){
			this.inherited(arguments);

			this.dropDown.onValueSelected = lang.hitch(this, function(value){
				this.focus(); // focus the textbox before the popup closes to avoid reopening the popup
				setTimeout(lang.hitch(this, "closeDropDown"), 1); // allow focus time to take
				TextBox.prototype._setValueAttr.call(this, value, true, value);
			});
		}
	}
);


declare( "dojox.form.YearTextBox", DateTextBox,
	{
		// summary:
		//		A validating, serializable, range-bound date text box with a popup calendar that contains only years

		popupClass: "dojox.widget.YearlyCalendar",

		format: function(value){
			//console.log('Year format ' + value);
			if(typeof value == "string"){
				return value;
			}
			else if(value.getFullYear){
				return value.getFullYear();
			}
			return value;
		},

		validator: function(value){
			return value == "" || value == null || /(^-?\d\d*$)/.test(String(value));
		},

		_setValueAttr: function(value, priorityChange, formattedValue){
			if(value){
				if(value.getFullYear){
					value = value.getFullYear();
				}
			}
			TextBox.prototype._setValueAttr.call(this, value, priorityChange, formattedValue);
		},

		openDropDown: function(){
			this.inherited(arguments);
			//console.log('yearly openDropDown and value = ' + this.get('value'));

			this.dropDown.onValueSelected = lang.hitch(this, function(value){
				this.focus(); // focus the textbox before the popup closes to avoid reopening the popup
				setTimeout(lang.hitch(this, "closeDropDown"), 1); // allow focus time to take
				TextBox.prototype._setValueAttr.call(this,value, true, value);
			});
		},

		parse: function(/*String*/value, /*dojo.date.locale.__FormatOptions*/constraints){
			return value || (this._isEmpty(value) ? null : undefined); // Date
		},

		filter: function(val){
			if(val && val.getFullYear){
				return val.getFullYear().toString();
			}
			return this.inherited(arguments);
		}
	}
);
return DateTextBox;
});