/* ------------------------------ EDITOR ------------------------------ */

function insert_style(element, code) {
	var text = getSelectedText(element);
	if (text == '') {
		var text = prompt( 'Enter the text to be formatted:\n<'+code+'>xxx<\/'+code+'>', '' );
		if (text == null) {
			return;
		}
	}
	
	// Insert
	insertAtCaret(element, '<'+code+'>'+text+'<\/'+code+'>');
	element.focus();
}

function insert_dropdown(element, code) {
	if (code != '') {
		insert_style(element, code);
	}
}

function insert_link(element) {

	var link_url = prompt('Enter the URL for the link:\n<a href="xxx"><\/a>','http://');
	if (link_url != null && link_url != '' && link_url != 'http://') {
	
		// Get selected text
		var link_text = getSelectedText(element);
		if (link_text == '') {
			// Display prompt if no text is selected
			link_text = prompt('Enter the text to be displayed for the link (Optional):\n<a href="">xxx<\/a>','');
		}
		if (link_text == null || link_text == '') {
			link_text = link_url;
		}
		var link_target = prompt('Open URL in new ("_blank") window (Optional):\n<a href="" target="xxx"><\/a>','');
		
		// Build output
		var str = '<a href="'+link_url+'"';
		if ((link_target != null) && (link_target != '')) {
			str += ' target="'+link_target+'"';
		}
		str += '>'+link_text+'<\/a>';
		
		// Insert
		insertAtCaret(element, str);
		element.focus();
	}
}

function insert_image(element) {
	var image_url = prompt('Enter the URL for the image:\n<img src="xxx" />','http://');
	if (image_url != null && image_url != '') {
	
		// Optional
		var image_width = prompt('Width (Optional):\n<img src="" width="xxx" />','');
		var image_height = prompt('Height (Optional):\n<img src="" height="xxx" />','');
		var image_alt = prompt('Alternate image description (Optional):\n<img src="" alt="xxx" />','');
		
		// Build output
		var str = '<img src="'+image_url+'"';
		if ((image_width != null) && (image_width != '')) {
			str += ' width="'+image_width+'"';
		}
		if ((image_height != null) && (image_height != '')) {
			str += ' height="'+image_height+'"';
		}
		if ((image_alt != null) && (image_alt != '')) {
			str += ' alt="'+image_alt+'"';
		}
		str += ' />';
		
		// Insert
		insertAtCaret(element, str);
		element.focus();
	
	}
}

function insert_list(element) {

	var item_array = new Array();
	var item = prompt('Item 1:  (Leave empty or cancel to exit)','');
	while (item != null && item != '') {
		item_array.push(item);
		item = prompt('Item '+(item_array.length+1)+': (Leave empty or cancel to exit)','');
	}
	
	if (item_array.length > 0) {
	
		// Build output
		var str = '<ul>\n';
		for (var i=0; i<item_array.length; i++) {
			str += '\t<li>'+item_array[i]+'<\/li>\n';
		}
		str += '<\/ul>\n';
		
		// Insert
		insertAtCaret(element, str);
		element.focus();				
	}
}

function getSelectedText(obj) {
	if (document.selection && document.selection.createRange) {
		// Internet Explorer 4.0x
		
		obj.focus();
		var orig = obj.value.replace(/\r\n/g, "\n"); // IE Bug
		var range = document.selection.createRange();
		
		if (range.parentElement() != obj) {
			return '';
		}
		
		txt = range.text;
		
		return txt;
	} else if (obj.selectionStart >= 0) {
		// FireFox & Safari
		var start = obj.selectionStart;
		var end    = obj.selectionEnd;
		var txt    = obj.value.substr(start, end-start);
		
		return txt;
	} else {
		return '';
	}
}

function setCaretTo(obj, pos) {
	if(obj.createTextRange) {
		var range = obj.createTextRange();
		range.move('character', pos);
		range.select();
	} else if(obj.selectionStart) {
		obj.focus();
		obj.setSelectionRange(pos, pos);
	}
}

function insertAtCaret(obj, text) {
	var mytext;
	obj.focus();
	
	if (document.selection) {
		// 'Code For IE'
		text = ' ' + text + ' ';
		if (obj.createTextRange && obj.caretPos) {
			var caretPos = obj.caretPos;
			caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
			return;
		}
	} else if (obj.selectionStart!==false) {
		// 'Code for Gecko'
		var start = obj.selectionStart;
		var end   = obj.selectionEnd;
		
		obj.value = obj.value.substr(0, start) + text + obj.value.substr(end, obj.value.length);
	}
	
	if (start != null) {
		setCaretTo(obj, start + text.length);
	} else {
		obj.focus();
		obj.value += text;
	}
}

function storeCaret(textEl) {
	if (textEl.createTextRange) {
		textEl.caretPos = document.selection.createRange().duplicate();
	}
}