function getCursorPosition(ctrl) {
 
	var CaretPos = 0;
	// IE Support
	if (document.selection) {
 
		ctrl.focus ();
		var Sel = document.selection.createRange ();
 
		Sel.moveStart ('character', -ctrl.value.length);
 
		CaretPos = Sel.text.length;
	}
	// Firefox support
	else if (ctrl.selectionStart || ctrl.selectionStart == '0')
		CaretPos = ctrl.selectionStart;
	return (CaretPos);
}
 
function setCursorPosition(ctrl, pos)
{
 
	if(ctrl.setSelectionRange)
	{
		ctrl.focus();
		ctrl.setSelectionRange(pos,pos);
	}
	else if (ctrl.createTextRange) {
		var range = ctrl.createTextRange();
		range.collapse(true);
		range.moveEnd('character', pos);
		range.moveStart('character', pos);
		range.select();
	}
}

function eventMaxLength(areaId, maxChar, counterId, blockEnter)
{
	if (typeof blockEnter == "undefined")
	{
		blockEnter = false;
	}

	$(function(){
		var tCounter = $("#" + counterId);
		var vMaxChar = maxChar;
		var tArea = $("#" + areaId);

		var PressedTab = false;

		function TestValue(){
			if (tArea.val().length > parseInt(vMaxChar)){
				old = getCursorPosition(tArea[0]);
				tArea[0].value = String(tArea[0].value).substr(0, parseInt(vMaxChar));
				setCursorPosition(tArea[0], old);
			}
			if (tCounter) tCounter[0].innerHTML = (parseInt(vMaxChar) - tArea.val().length);
		}

		tArea.keydown(function(b){
			if ((b.ctrlKey)&&(b.which == 13)){
				//AddToSendMsg(tOrder[0].value);
				return false;
			} else if ((b.which == 13)&&(blockEnter)) {
				return false;
			}
		});

		tArea.keypress(function(b){
			if ((b.which == 13)&&(blockEnter)) {
				return false;
			}
			if (b.which !== 17){
				if ((b.ctrlKey)&&(b.which == 67)){
					return true;
				}
				if ((b.which == 9)||((b.keyCode == 9)&&(b.which == 0))){
					tArea[0].value += String.fromCharCode(9);
					PressedTab = true;
				} else if ((b.which !== 8)&&(b.which !== 46)&&
				   (b.which !== 37)&&(b.which !== 38)&&
				   (b.which !== 39)&&(b.which !== 40)&&
				   (b.which !== 33)&&(b.which !== 34)&&
				   (b.which !== 35)&&(b.which !== 36)&&(b.which !== 0)){
					if (tArea.val().length >= parseInt(vMaxChar)){
						if (tCounter) tCounter[0].innerHTML = (parseInt(vMaxChar) - tArea.val().length);
						return false;
					}
				} else {
					TestValue();
				}
			}
			return true;
		});
		tArea.keyup(function(b){
			TestValue();
		});
		tArea.mousemove(function(b){
			TestValue();
		});
		tArea.blur(function(I){
			TestValue();
			if (PressedTab){
				tArea.focus();
				PressedTab = false;
			}
		});

		TestValue();
	});
}

function eventMaxLine(areaId, maxLine, maxPerLine, counterId, hiddenAreaId, breakWorld, blockEnter)
{
	if (typeof blockEnter == "undefined")
	{
		blockEnter = false;
	}

	if (typeof breakWorld == "undefined")
	{
		breakWorld = false;
	}

	$(function(){
		var tCounter = $("#" + counterId);
		var tArea = $("#" + areaId);
		var tHiddenArea = $("#" + hiddenAreaId);

		tArea.vMaxLine = maxLine;
		tArea.vMaxPerLine = maxPerLine;
		tArea.vBlockEnter = blockEnter;
		tArea.vBreakWorld = breakWorld;
		tArea.enterEnabled = true;

		var PressedTab = false;

		function getLen()
		{
			var nLine = 0;
			var currentCount = 0;
			var len = 0;
			var cut = 0;
			var pos = 0;
			var old = -1;
			var recreated = false;
			var cut_out = "";

			tArea.enterEnabled = true;

			if (tArea.val().length > 0){

				var spl = String(tArea.val()).split(String.fromCharCode(10));

				for(var i = 0; i < spl.length; i++)
				{
					ln = spl[i].length;

					if (ln > tArea.vMaxPerLine)
					{
						if (old == -1) old = getCursorPosition(tArea[0]);

						subln = spl[i].substr(tArea.vMaxPerLine, ln - tArea.vMaxPerLine);

						pos += tArea.vMaxPerLine;

						spl[i] = spl[i].substr(0, tArea.vMaxPerLine);

						if (old > pos + i)
						{
							old += 2;
						}

						if ((i + 1) < spl.length)
						{
							if (old > pos + 2 + i + subln.length)
							{
								old += 1;
							}
							spl[i+1] = subln + " " + spl[i+1];
						} else {
							spl[i+1] = subln;
						}

						processBreak = true;
						if (subln.length > 0)
						{
							if (subln.charCodeAt(0) == 32)
							{
								processBreak = false;
								spl[i+1] = spl[i+1].substr(1, spl[i+1].length - 1);
								if (old >= (pos + i + 2))
								{
									old--;
								}
							}
						}

						if ((!tArea.vBreakWorld)&&(processBreak))
						{
							for(var j = (tArea.vMaxPerLine - 1); j >= 0; j--)
							{
								if (spl[i].charCodeAt(j) == 32)
								{
									subln = '';
									if (((tArea.vMaxPerLine - j) - 1) > 0)
									{
										pos -= tArea.vMaxPerLine;
										pos += j;
										subln = spl[i].substr(j+1, (tArea.vMaxPerLine - j) - 1);
										//alert(pos + "," + i + "," + j + "," + old);
										if ((pos + i) <= old)
										{
											old += 1;
										}
									}
									spl[i] = spl[i].substr(0, j);
									spl[i+1] = subln + spl[i+1];
									break;
								}
							}
						}

						recreated = true;
					} else {
						pos += ln;
					}

					if (i < tArea.vMaxLine)
					{
						cut = cut + spl[i].length + 1;
						cut_out = cut_out + ((i > 0) ? "\n" : "") + spl[i];
					}
				}

				if (spl.length >= tArea.vMaxLine)
				{
					tArea.enterEnabled = false;
				}

				if (tHiddenArea)
				{
					var out = spl.join(String.fromCharCode(10));
					if (tHiddenArea[0].id == tArea[0].id)
					{
						if (recreated)
						{
							tHiddenArea[0].value = cut_out;
							if (old != -1) setCursorPosition(tArea[0], old);
						}
					} else {
						tHiddenArea[0].value = cut_out;
					}
				}

				len = ((spl.length - 1) * tArea.vMaxPerLine) + spl[spl.length - 1].length;
			}

			return {"len": len, "cut": (cut - 1), "recreated": recreated, "cut_out": cut_out};
		}

		function TestValue()
		{
			len = getLen();

			if ((len.len > (tArea.vMaxLine * tArea.vMaxPerLine))&&(len.cut != -1)){
				old = getCursorPosition(tArea[0]);
				tArea[0].value = len.cut_out;
				setCursorPosition(tArea[0], old);
				len = getLen();
			}

			if (tCounter) tCounter[0].innerHTML = (tArea.vMaxLine * tArea.vMaxPerLine) - len.len;
		}

		tArea.keydown(function(b){
			if ((b.ctrlKey)&&(b.which == 13)){
				return false;
			} else if ((b.which == 13)&&((tArea.vBlockEnter)||(!tArea.enterEnabled))) {
				return false;
			}
		});

		tArea.keypress(function(b){
			if ((b.which == 13)&&((tArea.vBlockEnter)||(!tArea.enterEnabled))) {
				return false;
			}
			if (b.which !== 17){
				if ((b.ctrlKey)&&(b.which == 67)){
					return true;
				}
				if ((b.which == 9)||((b.keyCode == 9)&&(b.which == 0))){
					//tArea[0].value += String.fromCharCode(9);
					//PressedTab = true;
					TestValue();
				} else if ((b.which !== 8)&&(b.which !== 46)&&
				   (b.which !== 37)&&(b.which !== 38)&&
				   (b.which !== 39)&&(b.which !== 40)&&
				   (b.which !== 33)&&(b.which !== 34)&&
				   (b.which !== 35)&&(b.which !== 36)&&(b.which !== 0)){
					var len = getLen();
					if (len.len >= (tArea.vMaxLine * tArea.vMaxPerLine)){
						if (tCounter) tCounter[0].innerHTML = (tArea.vMaxLine * tArea.vMaxPerLine) - len.len;
						return false;
					}
				} else {
					TestValue();
				}
			}
			return true;
		});
		tArea.keyup(function(b){
			TestValue();
		});
		tArea.mousemove(function(b){
			if (tArea.focused)
				TestValue();
		});
		tArea.blur(function(I){
			TestValue();
			if (PressedTab){
				tArea.focus();
				PressedTab = false;
			}
		});

		TestValue();
	});
}

