var PbTextAreaCheck = {
	init: function ()
	{
		$$('textarea').each(function (textarea)
		{
			var mRes;
			if (mRes = textarea.className.match(/(^|\s)maxlength_(\d*)($|\s)/)) {
				if (mRes[2] > 0) {
					textarea.maxlength = mRes[2];
				}
			}
			if (mRes = textarea.className.match(/(^|\s)maxlines_(\d*)($|\s)/)) {
				if (mRes[2] > 0) {
					textarea.maxlines = mRes[2];
				}
			}
			if (mRes = textarea.className.match(/(^|\s)maxWords_(\d*)($|\s)/)) {
				if (mRes[2] > 0) {
					textarea.maxWords = mRes[2];
				}
			}
			if (mRes = textarea.className.match(/(^|\s)smsCount_(\d*)($|\s)/)) {
				textarea.smsCount = mRes[2];
			}
			if (textarea.maxlines || textarea.maxlength || textarea.maxWords || textarea.smsCount) {
				textarea.lastOkVal = textarea.value;
				textarea.observe('keydown', PbTextAreaCheck.checkNextKey);
				textarea.observe('keyup', PbTextAreaCheck.checkContent);
				textarea.observe('change', PbTextAreaCheck.checkContent);
				textarea.observe('blur', PbTextAreaCheck.checkContent);
			}

			if (textarea.countdownspan = $('wordscountdown_' + textarea.id)) {
				textarea.showCountdown = 'words';
			}

			if (textarea.smscountspan = $('smscounter_' + textarea.id)) {
				textarea.showSMSCounter = true;
			}
		});
	},
	checkNextKey: function (event)
	{
		var elem = event.element();
		if (event.keyCode == 8) {
			return true;
		}
		if (elem.maxlength) {
			if (elem.maxlength && elem.value.length >= elem.maxlength) {
				return false;
			}
		}
		if (elem.maxWords) {
			var re = new RegExp("(.*\\s){" + (elem.maxlines - 1) + "}");
			if (elem.value.match(re)) {
				return false;
			}
		}
		if (elem.maxlines && event.keyCode == 13) {
			var re = new RegExp("(.*\\n){" + (elem.maxlines - 1) + "}");
			if (elem.value.match(re)) {
				return false;
			}
		}
		return true;
	},
	checkContent: function (event)
	{
		var elem = event.element();

		// Check for backspace and delete keys, they should always be allowed
		if (!Object.isUndefined(event.keyCode) && (event.keyCode == 8 || event.keyCode == 46)) {
			elem.lastOkVal = elem.value;
			return true;
		}

		if (elem.maxlength) {
			if (elem.maxlength && elem.value.length > elem.maxlength) {
				if (elem.lastOkVal == "") {
					elem.value = elem.value.substring(0, elem.maxlength);
				} else {
					elem.value = elem.lastOkVal;
					return;
				}
			}
		}
		if (elem.maxWords) {
			if (elem.value.strip()) {
				wordCount = elem.value.strip().split(/[\s]+/).length;
			} else {
				wordCount = 0;
			}
			if (wordCount > elem.maxWords) {
				elem.value = elem.lastOkVal;
				wordCount = elem.maxWords;
				return;
			}
		}
		if (elem.smsCount) {
			if (elem.value.length <= 160) {
				characterCount = elem.value.length;
				messageCount = 1;
			} else if (elem.value.length > 160) {
				characterCount = elem.value.length;
				if(characterCount % 153 != 0) {
					i = characterCount;
					messageCount = 0;
					while(i != 0 && i >= 0) {
						messageCount ++;
						i = i - 153;
					}
				} else {
					messageCount = characterCount / 153;
				}
			} else {
				characterCount = 0;
			}
		}
		if (elem.maxlines) {
			var re = new RegExp("(.*\\n){" + elem.maxlines + "}");
			if (elem.value.match(re)) {
				elem.value = elem.lastOkVal;
				return;
			}
		}

		if (elem.showCountdown == 'words') {
			elem.countdownspan.update(elem.maxWords - wordCount);
		}

		if (elem.showSMSCounter == true) {
			if (messageCount > 1) {
				elem.smscountspan.update(elem.smsCount = characterCount + ' (' + messageCount + ' ' + PbLib.g('messages') + ')');
			} else {
				elem.smscountspan.update(elem.smsCount = characterCount + ' (' + messageCount + ' ' + PbLib.g('message') + ')');
			}
		}

		elem.lastOkVal = elem.value;
	}
}
Event.observe(window, 'load', PbTextAreaCheck.init);