function obfuscatePassword(value) {
	var res=[];
	for(var i=0; i<value.length; ++i) {
		res.push('●');
	}
	return res.join('');
}

function capitalizeFirstLetter(value)
{
	if(value.length>=1) {
		return value.charAt(0).toUpperCase() + value.slice(1);
	} else return '';
}

var StringInput = Class.create(JSControl, {
initialize: function(input) {
	this.input=input;
	this.ID_=this.input.readAttribute('id');
	this.input.JSControl=this;
	this.passwd=this.input.readAttribute('password');
	this.capitalizeFirst=this.input.readAttribute('capitalize-first');
	
//	var url = Element.readAttribute(this.input, "url");
//	if (url && url.length > 0) new DynamicAutosuggest(this);
	
	$(this.input).observe('change', this.OnChange.bind(this));
	$(this.input).observe('keydown', this.OnInput.bind(this));
	$(this.input).observe('keypress', this.OnInput.bind(this));
	$(this.input).observe('drop', this.OnChange.bind(this));

	this.parent=input.parentNode;
	this.span=new Element('span', {id: this.ID_, localid: this.input.readAttribute('localid'), 'class': this.input.className});
	this.span.JSControl=this;
	this.CapitalizeInputValueIfNecessary();
	this.UpdateSpan();

	this.visibility=this.input.readAttribute('visibility');
	if(!this.visibility) this.visibility='yes';
	if(this.visibility=='link') {
		this.parent.replaceChild(this.span, this.input);
		$(this.span).observe('click', this.OnClick.bind(this));
	}
	if(this.visibility=='vo') {
		this.parent.replaceChild(this.span, this.input);
	}
	if(this.visibility=='ro') this.input.writeAttribute('disabled', 'disabled');
},

OnChange: function(evt) {
	this.CapitalizeInputValueIfNecessary();
	this.UpdateSpan();
	new AEvent("CHANGE", {}, this);
},

OnClick: function(evt) {
	new AEvent("CLICK", {}, this);
},

OnInput: function(evt) {
	var fn = function () {
		new AEvent("INPUT", {}, this);
	};

	fn.bind(this).defer();
},

SetValue: function(value) {
	if (value instanceof Optional && value.Value() != undefined) {
		this.input.value=value.Value();
	}
	else if (typeof(value) == 'string' && value!=undefined) {
		this.input.value=value;
	}
	// TODO (FIXME): Implement kosher DateTime control and remove this
	else if (value instanceof Time) {
		if(value.toString()=='null') this.input.value="";
		else this.input.value=value.toString();
	}
	else {
		this.input.value='';
	}
	this.CapitalizeInputValueIfNecessary();
	this.UpdateSpan();
},

CapitalizeInputValueIfNecessary: function() {
	if(this.capitalizeFirst=='yes') {
			this.input.value=capitalizeFirstLetter(this.input.value);
	}
},

UpdateSpan: function() {
	if(this.passwd=='yes') this.span.update(obfuscatePassword(this.input.value));
	else this.span.update(this.input.value);
},

Value: function() {
	if(typeof(this.input.value) == 'undefined' || this.input.value===null) return optional(undefined);
	if (this.input.value === "") return optional(undefined);
	return optional(this.input.value.toString());
},

SetAttribute: function(sName, sValue) {
	if(sName=='visibility' && sValue!=this.visibility) {
		if((this.visibility=='yes' || this.visibility=='ro') && (sValue=='vo' || sValue=='link')) {
			this.parent.replaceChild(this.span, this.input);
			if(sValue=='link') {
				$(this.span).observe('click', this.OnClick.bind(this));
			}
			this.visibility=sValue;
		}
		else if((this.visibility=='vo' || this.visibility=='link') && (sValue=='yes' || sValue=='ro')) {
			this.parent.replaceChild(this.input, this.span);
			if(sValue=='ro') this.input.writeAttribute('disabled', false);
			else this.input.writeAttribute('disabled', 'disabled');
			this.visibility=sValue;
		}
	}
	this.input.writeAttribute(sName, sValue);
	this.span.writeAttribute(sName, sValue);
},

SetTabOrder: function(nTabBase) {
	this.input.writeAttribute('tabindex', nTabBase);
	return ++nTabBase;
},

Focus: function() {
	this.input.focus();
},

ID: function() { return this.ID_; }

});

