var FormTextarea = Class.create(
{
	initialize: function(element, messageContainerId)
	{
		this.messagesBoxId = messageContainerId;
		this.element = element;
		this.maxLength = element.getAttribute("maxlength");
		this.valueLength = 0;
		this.superfluousCharsCount = 0;
		this.counterValue = this.maxLength;
		this._counterContainer = $(this.element.id + "_counter");
		//{ Observing
			Event.observe(element, "paste", this._onBuffFuncHandler.bindAsEventListener(this));
			Event.observe(element, "cut", this._onBuffFuncHandler.bindAsEventListener(this));
			Event.observe(element, "keypress", this._onChangeHandler.bindAsEventListener(this));
			Event.observe(element, "change", this._onChangeHandler.bindAsEventListener(this));
			Event.observe(element, "keyup", this._onChangeHandler.bindAsEventListener(this));
		if(this.maxLength != null){
			this._counterContainer.setStyle({
				display: "block",
				opacity: "0.0"});
		}
		this._valueChanged();
	},

	_onBuffFuncHandler: function(e)
	{
		window.setTimeout(this._valueChanged.bind(this), 100);
	},

	_onChangeHandler: function(e)
	{
		this._valueChanged();
	},

	_valueChanged: function()
	{
		if(!this._testLength()){
			this.element.value = this.element.value.substring(0, this.maxLength - this.superfluousCharsCount);
		}
		this._setCounter();
	},

	_testLength: function()
	{
		if(this.maxLength == null)
			return true;

		var value = this.element.value.match(new RegExp("\\n", "g"));
		if(value != null){
			this.superfluousCharsCount = value.length;
		} else {
			this.superfluousCharsCount = 0;
		}
		this.valueLength = this.element.value.length;
		this.valueLength += this.superfluousCharsCount;
		if (this.valueLength > this.maxLength){
			this.valueLength = this.maxLength;
			return false;
		}

		return true;
	},

	_setCounter: function()
	{
		if(this.maxLength != null){
			var counterVal = this.maxLength - this.valueLength;
			if(this.counterValue != counterVal){
				this.counterValue = counterVal;
				this._showCounter();
			}
		}
	},

	_showCounter: function()
	{
		var counterClass = this.counterValue > 5 ? "" : this.counterValue > 0 ? "warning" : "error";
		this._counterContainer.innerHTML = "<span class=\""+ counterClass +"\">"+ this.counterValue +"</span>";

		if (this._showEffect != null) {
			this._showEffect.cancel();
		}

		var afterFinnishHandler = function(){
			if(this.counterValue > 0){
				this._showEffect = new Effect.Opacity(this._counterContainer, {
					from: Element.getOpacity(this._counterContainer),
					to: 0.0,
					duration: 1.2 });
			}
		}.bind(this);

		this._showEffect = new Effect.Opacity(this._counterContainer, {
			from: Element.getOpacity(this._counterContainer),
			to: 1,
			duration: 0.6,
			afterFinish: afterFinnishHandler});
	}
});
CtPage.registerScript("FormTextarea");
