function CharCounter(el){
	if (!el) return false;

	var fldEl = el;
	var msgEl, statusEl, limitEl, maxLen, updThresh;

	var check = function (e) {
		var newEl = statusEl.cloneNode(true);
		var inputStr = fldEl.value;
	
		if(!inputStr.match(/(\r\n)/)){
			if(inputStr.match(/(\r)/)){
				inputStr = inputStr.replace(/(\r)/g, "xx"); 
			}else if(inputStr.match(/(\n)/)){
				inputStr = inputStr.replace(/(\n)/g, "xx");
			}	
		}
		var currentLen = inputStr.length; 

		if (currentLen > maxLen) {
			remVal = maxLen - currentLen;
			phrase = (maxLen - currentLen == -1)? ' character ':' characters ';
			newEl.innerHTML = '(' + addCommas(-remVal + '') + phrase + 'over' + '.)';
			newEl.className = "limit error";
			newEl.style.color='red';
		} else if (currentLen == maxLen){
			newEl.innerHTML = 'No more characters left.';
			newEl.className = "limit error";
			newEl.style.color='red';
		} else if (currentLen < maxLen) {
			remVal = maxLen - currentLen;
			phrase = (maxLen - currentLen == 1)? ' character ':' characters ';
			newEl.innerHTML = addCommas(remVal.toString()) + phrase + 'left';
			newEl.className = 'limit';
			newEl.style.color='';
		}
		msgEl.replaceChild(newEl, statusEl);
		statusEl = newEl;
	}

	var init = function(){
		var lenMatch = fldEl.className.match(/.*?maxChars(\d+)/);
		if (lenMatch && lenMatch[1]) maxLen = lenMatch[1];
		
		msgEl = mkEl("p");
		statusEl = mkChild(msgEl, "span");
		statusEl.className = 'limit';

		fldEl.parentNode.insertBefore(msgEl, fldEl.nextSibling);

		check();
		addEvent( fldEl, 'keyup', check );
	}
	init();

}

register( 'textarea.hasMaxLen', CharCounter );
//register( 'input.hasMaxLen', CharCounter );
