function caretPos(element)
    {
    var i=element.value.length+1;
    if (element.createTextRange){
        theCaret = document.selection.createRange().duplicate();
        while ( theCaret.parentElement() == element && theCaret.move("character",1)==1 )
        {
            --i;
        }
    }
    return i==element.value.length+1?-1:i;
}

function moveCaret (el, iCaretPos)
{
    if(iCaretPos > el.value.length)
        {
            iCaretPos = el.value.length;

        }

    if (document.selection) // IE
    {
        var range;
        //iCaretPos++;
        range = document.selection.createRange();

        if (el.type == 'text') // textbox
        {
            range.moveStart ('character', -el.value.length);
            range.moveEnd ('character', -el.value.length);
            range.moveStart ('character', iCaretPos);
            range.select();
        }
        else // textarea
        {
            range.collapse(false);
            range.move ('character', iCaretPos - el.value.length);
            range.select();
        }
    }
    else if (el.selectionStart || el.selectionStart == '0') // Firefox
    {
        el.setSelectionRange(iCaretPos, iCaretPos);
    }
}

function limitTextLength(elementName, totalChars, maxChars, maxRows)
{
    var usesReturns = false;
    var element = document.getElementById(elementName);
    var position = caretPos(element);
    var movePosition = 0;
    var changed = false;
    if(position < 0)
    {
        position = element.selectionStart;
    }

    var currentstring = element.value;

    currentstring = currentstring.replace(/\r/g,'');

    var list = currentstring.split('\n');
    var totalcharacterspassed = 0;
    for(var i = 0; i < maxRows && i < list.length; i++)
    {
        var currentline = list[i];

        if(currentline.length > maxChars)
        {

            for(var j = maxChars; j > 0; j--)
            {
                if(list[i].substr(j, 1) == ' ' && i < (maxRows-1))
                {
                    list[i] = list[i].substr(0, j)+'\n'+list[i].substr(j + 1);
                    changed = true;
			if(position > (totalcharacterspassed + j +i +1))
			{
			    movePosition++;
			}
                    break;
                }

                if(j == 1)
                {
                    list[i] = list[i].substr(0, maxChars)+'\n'+list[i].substr(maxChars);
                    if(position > (totalcharacterspassed + j +i +1))
                        {
                          movePosition++;
		          position++;
                        }


                    changed = true;
                }
            }
        }
	totalcharacterspassed += currentline.length + 1;

    }

    var newlist = list.join('\n').split('\n');

    var newvalue = newlist.slice(0,maxRows).join('\n');
    if(newvalue != element.value)
    {
        element.value = newvalue;
        if(element.value.split('\r').length > 0)
        {
            position = position + movePosition;
        }

        element.selectionStart = position;
        element.selectionEnd = position;
        moveCaret(element, position);
    }

   if(changed == true)
   {
       limitTextLength(elementName, totalChars, maxChars, maxRows);
   }
}
