function sel_get_start(textarea) {

	if(typeof(textarea.selectionStart) != "undefined") {
		// A sensible browser
		return textarea.selectionStart;
	}

	if(document.selection.createRange) {
		// IE

		textarea.focus();

		var range = document.selection.createRange();
		var drange = range.duplicate();
		var start;

		if(range.parentElement() != textarea) return textarea.value.length;

		drange.moveToElementText(textarea);
		drange.setEndPoint("EndToEnd", range);

		start = drange.text.length - range.text.length;
		if(start >= 0) return start;
	}

	return textarea.value.length;
}


function sel_get_len(textarea) {

	if(typeof(textarea.selectionEnd) != "undefined") {
		// A sensible browser
		return textarea.selectionEnd - textarea.selectionStart;
	}

	if(document.selection.createRange) {
		// IE

		textarea.focus();

		var range = document.selection.createRange();
		if(range.parentElement() != textarea) return 0;
		return range.text.length;
	}

	return 0;
}



function sel_set(textarea, start, len) {

	textarea.focus();

	if(textarea.setSelectionRange) {
		textarea.setSelectionRange(start, start+len);
		return;
	}

	if(document.selection.createRange) {
		// IE
		var range = document.selection.createRange();
		range.moveToElementText(textarea);
		range.moveStart("character", start);
	}
}





// Replaces the currently selected text with the passed text.
function textarea_insert(textarea, text) {
	var topos;
	var scrollPos = textarea.scrollTop;

	var start = sel_get_start(textarea);
	var len = sel_get_len(textarea);
	var begin = textarea.value.substr(0, start);
	var middle = textarea.value.substr(start, len);
	var end = textarea.value.substr(start + len);

	textarea.value = begin + text + end;

	topos = start + text.length;
	sel_set(textarea, topos, 0);

	textarea.scrollTop = scrollPos;

	return;
}



// Encloses the currently selected text with the passed tags.
function textarea_enclose(textarea, tag1, tag2) {

	var topos;
	var scrollPos = textarea.scrollTop;

	var start = sel_get_start(textarea);
	var len = sel_get_len(textarea);
	var begin = textarea.value.substr(0, start);
	var middle = textarea.value.substr(start, len);
	var end = textarea.value.substr(start + len);

	textarea.value = begin + tag1 + middle + tag2 + end;

	if(len) topos = start + len + tag1.length + tag2.length;
	else topos = start + tag1.length;
	sel_set(textarea, topos, 0);

	textarea.scrollTop = scrollPos;

	return;
}



// Input: something like 'tag="blah" ...'
function get_tag_value(code) {
	var val;

	pos = code.indexOf("=");
	if(pos >= 0) {
		val = code.substr(pos+1);
	}
	else val = code;

	if(val.indexOf("\"") == 0) {
		// Quoted string
		val = val.substr(1);
		pos = val.indexOf("\"");
		if(pos > -1) val = val.substr(0, pos);
	}
	else if(val.indexOf("'") == 0) {
		// Single-quoted string
		val = val.substr(1);
		pos = val.indexOf("'");
		if(pos > -1) val = val.substr(0, pos);
	}
	else {
		// Unquoted string
		pos = val.indexOf(" ");
		pos2 = val.indexOf("\n");
		if(pos < 0) pos = pos2;
		else if(pos2 >= 0 && pos2 < pos) pos = pos2;
		pos2 = val.indexOf("\r");
		if(pos < 0) pos = pos2;
		else if(pos2 >= 0 && pos2 < pos) pos = pos2;

		if(pos > -1) val = val.substr(0, pos);
	}
	return val;
}




function vidcode_get_url(code) {
	var url = "";
	var pos, tmp; 

	if((pos = code.indexOf("<embed")) > -1) {
		// Embed code
		tmp = code.substr(pos);
		pos = tmp.indexOf("src=");
		if(pos > -1) {
			url = get_tag_value(tmp.substr(pos));

			return url;
		}
	}

	if(code.indexOf("<object") > -1) {
		// Object code
		tmp = code.substr(pos);
		pos = tmp.indexOf('param name="movie"');
		if(pos > -1) {
			tmp = tmp.substr(pos);
			pos = tmp.indexOf('value');
			if(pos > -1) {
				tmp = tmp.substr(pos);
				url = get_tag_value(tmp);

				return url;
			}
		}
	}

	// One of various Youtube codes?
	if(code.indexOf("youtube.com") > -1) {
		pos = code.indexOf("v=");
		if(pos >= 0) {
			// URL to view on Youtube. Get video ID.
			url = code.substr(pos+2);
			return "http://www.youtube.com/v/" + url;
		}
		else if((pos = code.indexOf("/embed/")) >= 0) {
			// URL to view on Youtube. Get video ID.
			url = code.substr(pos+7);
			if((pos = url.indexOf("\"")) >= 0) url = url.substr(0, pos);
			return "http://www.youtube.com/v/" + url;
		}
	}
	else if((pos = code.indexOf("youtu.be")) >= 0) {
		url = code.substr(pos+9);
		return "http://www.youtube.com/v/" + url;
	}

	return url;
}


function vidcode_get_wid(code) {
	var wid = 425;
	var pos, pos2;

	pos = code.indexOf("width=");
	if(pos > -1) {
		wid = get_tag_value(code.substr(pos));
	}

	return wid;
}


function vidcode_get_hig(code) {
	var hig = 344;
	var pos, pos2;

	pos = code.indexOf("height=");
	if(pos > -1) {
		hig = get_tag_value(code.substr(pos));
	}

	return hig;
}



function insert(em) {
	textarea_insert(document.composer.textfield, " " + em + " ");
}


function picinsert(p) {
	if(!p.length) return;
	textarea_insert(document.composer.textfield, "[img]" + p + "[/img]");
}


function dlinsert(p, name) {
	if(!p.length) return;
	textarea_insert(document.composer.textfield, "[url=\"" + p + "\"]" + name + "[/url]");
}


function thumbinsert(p, name) {
	if(!p.length) return;
	textarea_insert(document.composer.textfield, "[thumb width=\"100\" height=\"100\"]" + p + "[/thumb]");
}


function compo_bold() {
	textarea_enclose(document.composer.textfield, '[b]', '[/b]');
}

function compo_italic() {
	textarea_enclose(document.composer.textfield, '[i]', '[/i]');
}

function compo_url() {
	var url;
	url = window.prompt("Please enter the URL.");
	if(!url) return;

	if(sel_get_len(document.composer.textfield)) textarea_enclose(document.composer.textfield, '[url="'+url+'"]', '[/url]');
	else textarea_insert(document.composer.textfield, '[url="'+url+'"]'+url+'[/url]');
}

function compo_img() {
	var url;
	url = window.prompt("Please enter image URL.");
	if(!url) return;
	textarea_insert(document.composer.textfield, '[img]'+url+'[/img]');
}

function compo_vid() {
	var code, url, wid, hig;

	code = window.prompt("Please enter the URL or EMBED code for the video.");
	if(!code) return;

	url = vidcode_get_url(code);
	wid = vidcode_get_wid(code);	// 425;
	hig = vidcode_get_hig(code);	// 344;

	textarea_insert(document.composer.textfield, '[video width="'+wid+'" height="'+hig+'"]'+url+'[/video]');
}

function compo_list() {
	textarea_enclose(document.composer.textfield, '[list]\n[*] ', '\n[/list]\n');
}

function compo_code() {
	textarea_enclose(document.composer.textfield, '[code]', '[/code]\n');
}

function compo_tag(t) {
	textarea_enclose(document.composer.textfield, "[" + t + "]", "[/" + t + "]");
}

function compo_align(side) {
	textarea_enclose(document.composer.textfield, "[align=" + side + "]", "[/align]");
}

function toggledisplay(id) {
	var d = document.getElementById(id);
	if(!d) return;
	if(d.style.display == "none") d.style.display = "block";
	else d.style.display = "none";
}

function hidebyid(id) {
	var d = document.getElementById(id);
	if(!d) return;
	else d.style.display = "none";
}

function showbyid(id) {
	var d = document.getElementById(id);
	if(!d) return;
	else d.style.display = "block";
}

// Like toggledisplay, but the default state is assumed to be none
function compo_colorlist() {
	var d = document.getElementById("composer_colorlist");
	if(!d) return;
	if(d.style.display == "block") d.style.display = "none";
	else d.style.display = "block";
}

function compo_color(color) {
	textarea_enclose(document.composer.textfield, '[font color="'+color+'"]', '[/font]');
	// hidebyid("composer_colorlist");
}


////////////////////////////////////////////////////


var composer_status_inited = false;
var composer_toggle_status = false;


function compo_set_status(s) {
	document.getElementById("composer3_statustext").innerHTML = s;
	composer_toggle_status = true;
}


function compo_reset_status() {
	document.getElementById("composer3_statustext").innerHTML = "";
	composer_toggle_status = false;
	composer_auto_status();
}


function composer_textfield_focus() {
	document.composer.textfield.focused = true;
}


function composer_textfield_unfocus() {
	var d = document.getElementById("composer3_statustext");
	document.composer.textfield.focused = false;
	if(d && !composer_toggle_status) d.innerHTML = "";
}


function composer_auto_status() {

	if(composer_toggle_status) return;

	var d = document.getElementById("composer3_statustext");
	if(!(d && document.composer && document.composer.textfield)) return;

	var tf = document.composer.textfield;

	if(!composer_status_inited) {

		if (tf.addEventListener) {
			tf.addEventListener("focus", composer_textfield_focus, false);
		} else if (tf.attachEvent) {
			tf.attachEvent("onfocus", composer_textfield_focus);
		} else {
			return false;
		}

		if (tf.addEventListener) {
			tf.addEventListener("blur", composer_textfield_unfocus, false);
		} else if (tf.attachEvent) {
			tf.attachEvent("onblur", composer_textfield_unfocus);
		} else {
			return false;
		}

		composer_status_inited = true;
	}

	if(tf.focused) {
		var start = sel_get_start(tf);
		var len = sel_get_len(tf);
		if(len) {
			d.innerHTML = "Selected: " + len + " / " + tf.value.length;
		}
		else {
			d.innerHTML = "Position: " + start + " / " + tf.value.length;
		}
		// d.innerHTML = "Characters: " + tf.value.length;
	}
}


window.setInterval(composer_auto_status, 100);





////////////////////////////////////////////////////


function compo_toggle_emos() {
	var d = document.getElementById("composer3_emoticon_sizer");
	if(d) {
		var disp = d.style.display;
		if(disp == "none") {
			d.style.display = "block";
			document.getElementById("composer3_emo_toggler").className += " composer3_button_on";
		}
		else {
			d.style.display = "none";
			document.getElementById("composer3_emo_toggler").className = document.getElementById("composer3_emo_toggler").className.replace("composer3_button_on", "");
		}
	}
}


