/*
	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.Textbox");

dojo.require("dojo.widget.*");
dojo.require("dojo.widget.HtmlWidget");
dojo.require("dojo.widget.Manager");
dojo.require("dojo.widget.Parse");
dojo.require("dojo.xml.Parse");
dojo.require("dojo.lang.array");
dojo.require("dojo.lang.common");

dojo.require("dojo.i18n.common");
dojo.requireLocalization("dojo.widget", "validate", null, "fr,ja,zh-cn,ROOT");

dojo.widget.defineWidget(
	"dojo.widget.Textbox",
	dojo.widget.HtmlWidget,
	{
		// summary:
		//		A generic textbox field.
		//		Serves as a base class to derive more specialized functionality in subclasses.

		// className: String
		//		The textbox class attribute.
		className: "",

		//	name: String
		//		The textbox name attribute.
		name: "",

		// value: String
		//		The textbox value attribute.
		value: "",

		// type: String
		//		Basic input tag type declaration.
		type: "",

		//	trim: Boolean
		//		Removes leading and trailing whitespace if true.  Default is false.
		trim: false,

		//	uppercase: Boolean
		//		Converts all characters to uppercase if true.  Default is false.
		uppercase: false,

		//	lowercase: Boolean
		//		Converts all characters to lowercase if true.  Default is false.
		lowercase: false,

		//	ucFirst: Boolean
		//		Converts the first character of each word to uppercase if true.
		ucFirst: false,

		//	digit: Boolean
		//		Removes all characters that are not digits if true.  Default is false.
		digit: false,

		// htmlfloat: String
		//		"none", "left", or "right".  CSS float attribute applied to generated dom node.
		htmlfloat: "none",

		templatePath: dojo.uri.dojoUri("src/widget/templates/Textbox.html"),

		// textbox DomNode:
		//		our DOM node
		textbox: null,

		fillInTemplate: function() {
			// assign value programatically in case it has a quote in it
			this.textbox.value = this.value;
		},

		filter: function() {
			// summary: Apply various filters to textbox value
			if (this.trim) {
				this.textbox.value = this.textbox.value.replace(/(^\s*|\s*$)/g, "");
			}
			if (this.uppercase) {
				this.textbox.value = this.textbox.value.toUpperCase();
			}
			if (this.lowercase) {
				this.textbox.value = this.textbox.value.toLowerCase();
			}
			if (this.ucFirst) {
				this.textbox.value = this.textbox.value.replace(/\b\w+\b/g,
					function(word) { return word.substring(0,1).toUpperCase() + word.substring(1).toLowerCase(); });
			}
			if (this.digit) {
				this.textbox.value = this.textbox.value.replace(/\D/g, "");
			}
		},

		// event handlers, you can over-ride these in your own subclasses
		onfocus: function() {},
		onblur: function() { this.filter(); },

		// All functions below are called by create from dojo.widget.Widget
		mixInProperties: function(localProperties, frag) {
			dojo.widget.Textbox.superclass.mixInProperties.apply(this, arguments);
			if ( localProperties["class"] ) {
				this.className = localProperties["class"];
			}
		}
	}
);
