function writeDoumiApply() {
	var doumi = document.getElementById('writeDoumi');
	if(!doumi) return;

	var strongButton = document.createElement('button');
	var emButton = document.createElement('button');
	var linkUrlButton = document.createElement('button');
	var linkDescButton = document.createElement('button');
	var imageButton = document.createElement('button');
	var codeButton = document.createElement('button');
	var tabStringButton = document.createElement('button');
	var rowDecreaseButton = document.createElement('button');
	var rowIncreaseButton = document.createElement('button');
	var toolTip = document.createElement('button');

	document.getElementById('content').onkeydown = function(e) {
		var event = e ? e : window.event;
		if(event.ctrlKey && event.altKey) {
			var shortkeyInfos = doumi.getElementsByTagName('span');
			for(var i = 0; i < shortkeyInfos.length; i++) { shortkeyInfos[i].style.visibility = 'visible'; }
			switch(event.keyCode) {
				case 66: strongButton.click(); break;
				case 78: emButton.click(); break;
				case 77: linkUrlButton.click(); break;
				case 188: linkDescButton.click(); break;
				case 190: imageButton.click(); break;
				case 191: codeButton.click(); break;
				case 84: tabStringButton.click(); break;
				case 38: rowDecreaseButton.click(); break;
				case 40: rowIncreaseButton.click(); break;
				case 13: this.form.onsubmit() ? this.form.submit() : false; return false; break;
			}
		} else if((tabStringButton.className.indexOf('active') >= 0) &&!event.ctrlKey && !event.altKey && event.keyCode == 9) {
			if(document.selection && document.selection.createRange) {
				var range = document.selection.createRange();
				range.text = "\t" + range.text.replace(/\n/g, "\n\t");
			} else if(this.selectionStart || this.selectionStart == '0') {
				var startPos = this.selectionStart;
				var endPos = this.selectionEnd;
				var selText = this.value.substring(startPos, endPos);

				this.value = this.value.substring(0, startPos) + "\t" + selText.replace(/\n/g, "\n\t") + this.value.substring(endPos, this.value.length);
				if(selText) {
					this.selectionStart = startPos;
					this.selectionEnd = endPos + selText.replace(/\n/g, "\n\t").length - selText.length + 1;
				} else {
					this.selectionStart = startPos + 1;
					this.selectionEnd = this.selectionStart;
				}
			}
			return false;
		}
	}
	document.getElementById('content').onkeyup = function(e) {
		var event = e ? e : window.event;
		if(!event.ctrlKey || !event.altKey) {
			var shortkeyInfos = doumi.getElementsByTagName('span');
			for(var i = 0; i < shortkeyInfos.length; i++) { shortkeyInfos[i].style.visibility = 'hidden'; }
		}
	}

	strongButton.className = 'strong';
	emButton.className = 'em';
	linkUrlButton.className = 'linkUrl separator';
	linkDescButton.className = 'linkDesc';
	imageButton.className = 'image separator';
	codeButton.className = 'code separator';
	tabStringButton.className = 'tab';
	rowDecreaseButton.className = 'row';
	rowIncreaseButton.className = 'row';
	toolTip.className = 'toolTip';

	strongButton.setAttribute('type', 'button');
	emButton.setAttribute('type', 'button');
	linkUrlButton.setAttribute('type', 'button');
	linkDescButton.setAttribute('type', 'button');
	imageButton.setAttribute('type', 'button');
	codeButton.setAttribute('type', 'button');
	tabStringButton.setAttribute('type', 'button');
	rowDecreaseButton.setAttribute('type', 'button');
	rowIncreaseButton.setAttribute('type', 'button');
	toolTip.setAttribute('type', 'button');

	strongButton.setAttribute('title', '[굵게]');
	emButton.setAttribute('title', '[기울림]');
	linkUrlButton.setAttribute('title', '[주소]url[/주소]');
	linkDescButton.setAttribute('title', '[주소=url]설명[/주소]');
	imageButton.setAttribute('title', '[그림=url]');
	codeButton.setAttribute('title', '[코드]');

	strongButton.onclick = function() { writeDoumi_insertTags(document.getElementById('content'), '[굵게]', '[/굵게]'); }
	emButton.onclick = function() { writeDoumi_insertTags(document.getElementById('content'), '[기울림]', '[/기울림]'); }
	linkUrlButton.onclick = function() { writeDoumi_insertTags(document.getElementById('content'), '[주소]', '[/주소]'); }
	linkDescButton.onclick = function() {
		var selText = writeDoumi_getSelectionText(document.getElementById('content'));
		if(selText.substring(0, 7) == 'http://') writeDoumi_insertTags(document.getElementById('content'), '[주소=', ']|[/주소]');
		else writeDoumi_insertTags(document.getElementById('content'), '[주소=|]', '[/주소]');
	}
	imageButton.onclick = function() { writeDoumi_insertTags(document.getElementById('content'), '[그림=', ']'); }
	codeButton.onclick = function() { writeDoumi_insertTags(document.getElementById('content'), '[코드]', '[/코드]'); }
	tabStringButton.onclick = function() {
		if(this.className.indexOf('active') < 0) this.className += ' active';
		else this.className = 'tab';
		document.getElementById('content').focus();
	}
	rowDecreaseButton.onclick = function() { document.getElementById('content').rows -= 5; }
	rowIncreaseButton.onclick = function() { document.getElementById('content').rows += 5; }

	strongButton.onfocus = emButton.onfocus = linkUrlButton.onfocus = linkDescButton.onfocus 
		= imageButton.onfocus = codeButton.onfocus = tabStringButton.onfocus = function() { document.getElementById('content').focus(); }

	strongButton.innerHTML = strongButton.getAttribute('title') + ' <span class="key">B</span>';
	emButton.innerHTML = emButton.getAttribute('title') + ' <span class="key">N</span>';
	linkUrlButton.innerHTML = linkUrlButton.getAttribute('title') + ' <span class="key">M</span>';
	linkDescButton.innerHTML = linkDescButton.getAttribute('title') + ' <span class="key">,</span>';
	imageButton.innerHTML = imageButton.getAttribute('title') + ' <span class="key">.</span>';
	codeButton.innerHTML = codeButton.getAttribute('title') + ' <span class="key">/</span>';
	tabStringButton.innerHTML = 'Tab문자 입력하기 <span class="key">T</span>';
	rowDecreaseButton.innerHTML = '∧<span class="key">↑</span>';
	rowIncreaseButton.innerHTML = '∨<span class="key">↓</span>';
	toolTip.innerHTML = '[도움말]<span>내용입력란에 커서를 두고 Ctrl + Alt키를 누르시면,<br />알파벳이 나와요! 이 알파벳과 Ctrl + Alt + [알파벳]<br />조합이 그 버튼기능의 단축키입니다 :)</span>';

	doumi.appendChild(strongButton);
	doumi.appendChild(emButton);
	doumi.appendChild(linkUrlButton);
	doumi.appendChild(linkDescButton);
	doumi.appendChild(imageButton);
	doumi.appendChild(codeButton);
	doumi.appendChild(tabStringButton);
	doumi.appendChild(rowDecreaseButton);
	doumi.appendChild(rowIncreaseButton);
	doumi.appendChild(toolTip);
}

function writeDoumi_getSelectionText(obj) {
	if(document.selection && document.selection.createRange) {
	// IE/Opera
		// get current selection
		obj.focus();
		var range = document.selection.createRange();
		var selText = range.text;
	} else if(obj.selectionStart || obj.selectionStart == '0') {
	// Mozilla
		// get current selection
		obj.focus();
		var startPos = obj.selectionStart;
		var endPos = obj.selectionEnd;
		var selText = obj.value.substring(startPos, endPos);
	}
	return selText;
}

// apply tagOpen/tagClose to selection in textarea,
// use sampleText instead of selection if there is none
function writeDoumi_insertTags(obj, tagOpen, tagClose) {
	if(document.selection && document.selection.createRange) {
	// IE/Opera
		// save window scroll position
		if(document.documentElement && document.documentElement.scrollTop) var winScroll = document.documentElement.scrollTop;
		else if(document.body) var winScroll = document.body.scrollTop;

		// get current selection
		obj.focus();
		var range = document.selection.createRange();
		var selText = range.text;

		// insert tags
		range.text = tagOpen.replace('|', '') + selText + tagClose.replace('|', '');

		// set new selection
		if(selText == '')  {
			range.moveStart('character', - tagClose.length - selText.length);
			range.moveEnd('character', - tagClose.length);
		} else{
			var caretIndex = false;
			var caretOrder = null;
			if(tagOpen.indexOf('|') >= 0) { caretIndex = tagOpen.indexOf('|'); caretOrder = 'front'; tagOpen = tagOpen.replace('|', ''); }
			else if(tagClose.indexOf('|') >= 0) { caretIndex = tagClose.indexOf('|'); caretOrder = 'back'; tagClose = tagClose.replace('|', ''); }

			if(caretIndex) {
				if(caretOrder == 'front') {
					range.moveStart('character', - tagClose.length - selText.length - tagOpen.length + caretIndex);
					range.moveEnd('character', - tagClose.length - selText.length - tagOpen.length + caretIndex);
				}
				else {
					range.moveStart('character', - tagClose.length + caretIndex);
					range.moveEnd('character', - tagClose.length + caretIndex);
				}
			}
		}

		range.select();

		// restore window scroll position
		if(document.documentElement && document.documentElement.scrollTop) document.documentElement.scrollTop = winScroll;
		else if(document.body) document.body.scrollTop = winScroll;
	} else if(obj.selectionStart || obj.selectionStart == '0') {
	// Mozilla
		// save textarea scroll position
		var textScroll = obj.scrollTop;

		// get current selection
		obj.focus();
		var startPos = obj.selectionStart;
		var endPos = obj.selectionEnd;
		var selText = obj.value.substring(startPos, endPos);

		// insert tags
		obj.value = obj.value.substring(0, startPos)
				+ tagOpen.replace('|', '') + selText + tagClose.replace('|', '')
				+ obj.value.substring(endPos, obj.value.length);

		// set new selection
		if(selText == '') {
			obj.selectionStart = startPos + tagOpen.replace('|', '').length + selText.length;
			obj.selectionEnd = obj.selectionStart;
		} else {
			var caretIndex = false;
			var caretOrder = null;
			if(tagOpen.indexOf('|') >= 0) { caretIndex = tagOpen.indexOf('|'); caretOrder = 'front'; tagOpen = tagOpen.replace('|', ''); }
			else if(tagClose.indexOf('|') >= 0) { caretIndex = tagClose.indexOf('|'); caretOrder = 'back'; tagClose = tagClose.replace('|', ''); }

			if(!caretIndex) obj.selectionStart = startPos + tagOpen.length + selText.length + tagClose.length;
			else {
				if(caretOrder == 'front') obj.selectionStart = startPos + caretIndex;
				else obj.selectionStart = startPos + tagOpen.length + selText.length + caretIndex;
			}
			obj.selectionEnd = obj.selectionStart;
		}

		// restore textarea scroll position
		obj.scrollTop = textScroll;
	}
}

if(window.addEventListener) window.addEventListener('load', writeDoumiApply, false);
else if(window.attachEvent) window.attachEvent('onload', writeDoumiApply);
else window.onload = writeDoumiApply;
