/*
	Copyright (c) 2004-2006, The Dojo Foundation
	All Rights Reserved.

	Licensed under the Academic Free License version 2.1 or above OR the
	modified BSD license. For more information on Dojo licensing, see:

		http://dojotoolkit.org/community/licensing.shtml
*/

dojo.provide("dojo.widget.IntegerTextbox");

dojo.require("dojo.widget.ValidationTextbox");
dojo.require("dojo.validate.common");

dojo.widget.defineWidget(
	"dojo.widget.IntegerTextbox",
	dojo.widget.ValidationTextbox,
	{
		// summary:
		//		A subclass of ValidationTextbox.
		//		Over-rides isValid/isInRange to test for integer input.
		// signed: String
		//		The leading plus-or-minus sign. Can be true or false, default is either.
		/*=====
		signed: "either",
		// separator: "",
		//		The character used as the thousands separator.  Default is no separator.
		separator: "",
		// min: Number
		//		Minimum signed value.  Default is -Infinity
		min: undefined,
		// max: Number
		//		Maximum signed value.  Default is +Infinity
		max: undefined,
		=====*/
		mixInProperties: function(localProperties, frag){
			// First initialize properties in super-class.
			dojo.widget.IntegerTextbox.superclass.mixInProperties.apply(this, arguments);

			// Get properties from markup attributes, and assign to flags object.
			if((localProperties.signed == "true")||
				(localProperties.signed == "always")){
				this.flags.signed = true;
			}else if((localProperties.signed == "false")||
					(localProperties.signed == "never")){
				this.flags.signed = false;
				this.flags.min = 0;
			}else{
				this.flags.signed = [ true, false ]; // optional
			}
			if(localProperties.separator){
				this.flags.separator = localProperties.separator;
			}
			if(localProperties.min){
				this.flags.min = parseInt(localProperties.min);
			}
			if(localProperties.max){
				this.flags.max = parseInt(localProperties.max);
			}
		},

		isValid: function(){
			// summary: Over-ride for integer validation
			return dojo.validate.isInteger(this.textbox.value, this.flags);
		},
		isInRange: function(){
			// summary: Over-ride for integer validation
			return dojo.validate.isInRange(this.textbox.value, this.flags);
		}
	}
);
