	// CaretPosition object
	function CaretPosition()
	{
		var start = null;
		var end = null;
	}
	
	function getCaretPosition(oField)
	{
		var oCaretPos = new CaretPosition();
	
		// IE support
		if(document.selection)
		{
	  		oField.focus();
	
			/*  oField 의 캐럿의 현재 선택 영역을 가져 옵니다.  */
			var oSel = document.selection.createRange();
			/* 
			oField 의 선택 영역을 제일 앞으로 옮긴다.
			oField 의 선택 영역을 옮겨도 메모리 에서만 옮겨지고
			oField.select()를 호출하지 않으면 화면에 표시 되지 않는다.
			*/
			var oSel2 = oField.createTextRange();
			oSel2.moveStart("character", -oField.value.length);
			oSel2.moveEnd("character", -oField.value.length);
	
			if(document.selection.text != "")
			{
				/* 
				oField 의 선택 영역을 하나씩 이동하면서 현재 캐럿의 선택영역과 비교한다. 
				left 와 top 을 비교 해서 캐럿 시작위치를 결정한후 (end 는 놔두고 start 위치만 옮김)
				width 와 height 를 비교해서 캐럿의 종료 위치를 결정한다. (start 는 놔두고 end 만 옮김)
				*/
				for (var i=0; i<=oField.value.length ; i++)
				{
					if (oSel.boundingLeft==oSel2.boundingLeft && oSel.boundingTop==oSel2.boundingTop)
					{
						/* 시작위치 결정 */
						oCaretPos.start = i;
						
						for (var j=0; j< (oField.value.length - i); j++ )
						{
							if (oSel.boundingHeight==oSel2.boundingHeight && oSel.boundingWidth==oSel2.boundingWidth)
							{
								/* 종료위치 결정 */
								oCaretPos.end = j;
								break;
							}
							else
							{
								/* 시작 위치는 놔두고 종료 위치만 변경시킴 */
								oSel2.moveEnd("character", 1);
							}
						}
						break;
					}
					else
					{
						/* 종료 위치는 놔두고 시작위치만 변경시킴 */
						oSel2.moveStart("character", 1);
						oSel2.moveEnd("character", 0);
					}
				}
			}
			else
			{
				for (var i=0; i<=oField.value.length ; i++)
				{
					/* 캐럿의 선택영역이 0일경우 즉 선택없이 깜빡 거리고 있을 때만 작동함 */
			 		if (oSel.boundingLeft==oSel2.boundingLeft && oSel.boundingTop==oSel2.boundingTop && 
		 			    oSel.boundingHeight==oSel2.boundingHeight && oSel.boundingWidth==oSel2.boundingWidth)
		 			{
		   				oCaretPos.start = i;
			   			oCaretPos.end = i;
		   				break;
		 			}
		 			/* 한글자씩 옮긴다. moveEnd의 두번째 파라미터는 선택영역의 글자수 이다. */
		 			oSel2.moveStart("character", 1);
		 			oSel2.moveEnd("character", 0);
				}
			}
		}
		else if(oField.selectionStart || oField.selectionStart == '0')
		{
			// Firefox support
			/* FF 는 정말 간단함..ㅠ.ㅠ  */
	  		oCaretPos.start = oField.selectionStart;
	  		oCaretPos.end = oField.selectionEnd - oField.selectionStart;
		}
	
		// 선택이 시작된 위치와 선택된 문자수를 리턴.
		return (oCaretPos);
	}
	
	/*
	  oField : textarea
	  iCaretStart : 캐럿 시작위치, 글자수
	  iCaretEnd : 캐럿의 종료 위치, 선택영역의 글자 개수
	*/
	function setCaretPosition(oField, iCaretStart, iCaretEnd)
	{
		if (document.selection)
		{
			// IE Support
			/* 
			캐럿의 위치를 지정 하기 전에 현재 oField 에 조합형 한글이 입력중일 수 있으므로 (가 입력 하는데 ㄱ 만 입력 한 상태)
			blur 를 호출해서 글자 입력을 강제 종료 한다.  만약 blur 를 호출 안하고 하면
			조합형 한글이 입력 중일 경우 oField 에 focus 를 주는 순간 oField.value 가 
			입력 중이었던 조합형 한글로 변할 것이다.. (다나가 입력중 다나 ㄱ 만 입력 했다면 다 지워지고 ㄱ 만 입력됨..ㅠ.ㅠ)
			*/
			oField.blur();
	  
			/* 
			포커스 주고 value 를 입력하면 caret 이 oField의 가장 뒤로 이동 한다. 
			IE 의 경우 캐럿과 관련된 그어떤 명시적 위치 지정 방법도 있지 않기 때문에 (pixel 로 지정 하는거 외엔 없는 듯한..ㅠ.ㅠ)
			캐럿을 제일 뒤로 옮기는 이유는 캐럿을 oField 의 시작 위치에 놔둘 방법이 없었기 때문이다.
			캐럿을 제일 뒤로 옮겼다가 글자 길이 만큼 앞으로 옮기면 캐럿이 oField 의 시작위치로 이동한다.
			*/
			oField.focus();
			oField.value = oField.value;
	
			/*
			oField 의 value.length 만큼 앞으로 캐럿을 이동하면 캐럿이 oField 의 제일 앞으로 이동한다.
			캐럿을 제일 뒤로 일단 이동한후 앞으로 이동하지 않고 적당히 현재 위치에서 value.length 만큼 앞으로 이동하면
			캐럿이 음수 값을 갖을수 없기 때문에 제일 앞으로 역시 이동한다. 하지만 이경우 selection 의 범위가 textarea 를 벋어나
			잘못 하면 textarea 앞에 만약 글자를 입력 했다면 그 글자를 선택할수 있기 때문에 
			캐럿을 제일 뒤로 옮기고 length 만큼 정확히 앞으로 당겨서 시작 위치를 정확히 맞춘다.
			*/
			var oSel = document.selection.createRange();
			if(oField.value.length != 0)
			{
				oSel.moveStart ('character', -oField.value.length);
				oSel.moveEnd ('character', -oField.value.length);
			}
	
			/*
			주어진 캐럿 위치 만큼 뒤로 이동하면 된다. !! 드디어 끝
			moveEnd 의 두번째 파라미터는 테스트 결과 위치가 아니라 count 였다. (http://koxo.com 에서 약간 실수 한듯 ^^;)
			*/
			oSel.moveStart ('character', iCaretStart); 
			oSel.moveEnd ('character', iCaretEnd); // end 는 count 임;
	
			/* select 해주면 캐럿이 이동하신다.. ㅠ.ㅠ */
			oSel.select();
		}
		else if(oField.selectionStart || oField.selectionStart == '0')
		{
			// Firefox support
			/* FF 는 다 필요 없다. 완전 편하다. */
			oField.selectionStart = iCaretStart;
			
			if(iCaretEnd != null)
				oField.selectionEnd = iCaretStart + iCaretEnd;
			else
				oField.selectionEnd = iCaretStart;
	
			oField.focus();
		}
	}

	function insertText(field, text, selected) { // Insert text to cursor position 
	    if (document.selection)
	    { // for IE 
			var oSel = document.selection.createRange();
			oSel.text = text;
			oSel.select();
	    } 
	    else { // for FF 
	        var scroll = field.scrollTop; 
	        var start = field.selectionStart; 
	        var end = field.selectionEnd; 
	        field.value = field.value.substring(0, start) + text 
	                        + field.value.substring(end, field.value.length); 
	        if (selected) field.setSelectionRange(start, start+text.length); 
	        else field.setSelectionRange(start+text.length, start+text.length); 
	        field.scrollTop = scroll; 
	    } 
	} 	
	

/*
	function replaceTagword(oField, replaceStr)
	{
		// ajax로 돌려받은 XML로 후보 태그들을 구성하고,
		// 해당 태그가 선택되었을때, 태그부분을 선택된 태그로 교체해주는 역할. 
		
		
		// 현재의 캐럿 위치를 얻는다.
		var caretPos = getCaretPosition(oField);

		// 태그워드의 길이를 얻는다.
		var tagLen = tagword.length;

		// 현재 캐럿 위치에서 태그 길이를 빼서, 실제 선택이 시작되야 하는 위치를 얻는다.
		var selStart = caretPos.start - tagLen;

		// 태그 부분을 선택한다.
		setCaretPosition(oField, selStart, tagLen);

		// 선택된 태그부분을 replaceStr을 이용하여 교체한다.
		insertText(oField, replaceStr, false);	
	}
*/	
