﻿function detectspecialkeys(e) {
	var evtobj=window.event? event : e;
	
	if (!e) e = window.event;
	
	var unicode=e.keyCode? e.keyCode : e.charCode
	
	var shift=e.shiftKey;
	
    if (unicode==19) {
		insertsBoldTag();
    }
    if (unicode==9) {
		insertsItalicTag();
    }
    
    if (unicode==58 && shift==false) {
		insertsHyperLink();
    }
	
}

document.onkeypress=detectspecialkeys;


function insertsBoldTag() {
	findPositions();

	var text = area.value;
	if (startPosition!=endPosition) {
		var sbStr = text.substring(startPosition,endPosition);
		sbStr = "<b>"+sbStr+"</b>";

		fillsFormattedString(text,sbStr);
	}
}

function insertsItalicTag()
{
	findPositions();

	var text = area.value;
	if (startPosition!=endPosition) {
		var sbStr = text.substring(startPosition,endPosition);
		sbStr = "<i>"+sbStr+"</i>";

		fillsFormattedString(text,sbStr);
	}
}

function insertsHyperLink() {
	findPositions();
	
	if (document.getElementById('area')) {
	
		var text = area.value;
		if (startPosition!=endPosition) {
			var sbStr = text.substring(startPosition,endPosition);
			
			// link has http://
			if (sbStr.indexOf("http")>-1 || sbStr.substring(0,1)=="/") {
				sbStr = "<a href='"+sbStr+"' title=''>"+sbStr+"</a>";
			}
			// link is email
			else if (sbStr.indexOf("@")>-1) {
				sbStr = "<a href='mailto:"+sbStr+"' title=''>"+sbStr+"</a>";
			}
			// link needs http://
			else {
				sbStr = "<a href='http://"+sbStr+"/' title=''>"+sbStr+"</a>";
			}
	
			fillsFormattedString(text,sbStr);
		}
		// link needs http://
		else if (sbStr) {
			sbStr = "<a href='http://"+sbStr+"/' title=''>"+sbStr+"</a>";
			fillsFormattedString(text,sbStr);
		}

	}
}

function findPositions() {

	if (document.getElementById('area')) {
	
		var text = area.value;
	
		if (document.selection) {
			// Internet Explorer
			var range = document.selection.createRange();
			var dpl = range.duplicate();
			if (range.text.length > 0) {
				dpl.moveToElementText(area);
				dpl.setEndPoint("EndToEnd", range);
				startPosition = dpl.text.length-range.text.length;
				endPosition = startPosition + range.text.length;
			}
		}
		else {
			// Mozilla Firefox
			startPosition = area.selectionStart;
			endPosition = area.selectionEnd;
		}
	}
}

function fillsFormattedString(text, selectedText)
{
	// split textarea value into three pieces: before startPosition,
        // startPosition until endPosition, and after endPosition
	var str1 = text.substring(0,startPosition);
	var str2 = text.substring(startPosition,endPosition);
	var str3 = text.substring(endPosition,text.length);

	// replace str2 with formatted substring (selectedText)
	str2 = selectedText;
	// form the new string
	formattedStr = str1+str2+str3;
	area.value = formattedStr;
}
