ver = navigator.appVersion;

function ulredit_init() {
	ulredit_langlist = {};
	ulredit_typelist = {};
	newentries = {};
}

function selectlang_priority(lang) {
	var checkbox = document.getElementById('selectlang_'+lang);
	var field = document.getElementById('selectlangpriority_' + lang); 
	if (checkbox.checked) {
		field.style.visibility = 'visible';
	} else {
		field.style.visibility = 'hidden';
	}
}

function addlanguage() {
	var field = document.getElementById('add_language'); 
	lang = field.value;
	if (document.getElementById('selectlang_'+lang) == null) {
		var table = document.getElementById('ulredit_languages');
		var s = "<tr><td><input type=\"hidden\" name=\"selectlangnew_"+lang+"\" value=\"1\"/><input type=\"checkbox\"  id=\"selectlang_"+lang+"\" name=\"selectlang_"+lang+"\" value=\"1\" checked=\"checked\" title=\"Select this language\" onclick=\"selectlang_priority('"+lang+"')\" /></td><td> <img src=\"/images/langicons/"+lang+".jpg\" alt=\"flag\" /> "+field.options[field.selectedIndex].text+"</td><td><div class=\"percentagebar1\"><div class=\"percentagebar2\">0%</div></div></td><td>";
		s += "<select id=\"selectlangpriority_"+lang+"\" name=\"selectlangpriority_"+lang+"\" style=\"visibility: visible\" title=\"You can optionally select the priority of this language and thus control in which column it will show in the editor\"><option value=\"1\">1</option><option value=\"2\">2</option><option value=\"3\">3</option><option value=\"4\">4</option><option value=\"5\" selected=\"selected\">5</option></select></td>";
		s += "</tr>";
		table.innerHTML = s + table.innerHTML;
	} else {
		alert("That language is already in the list!");
	}
	return false;
}
function loading_data_editor() {
	var form = document.getElementById('ulredit_form'); 
	var loader = document.getElementById('loading_data_editor'); 
	var wrap = document.getElementById('ulredit_languages_wrap'); 
	loader.style.display = "block";
	wrap.style.display = "none";
	form.submit();
	return true;
}

function ulredit_submit(nextpage) {
	var loader = document.getElementById('loading_data_editor'); 
	var wrap = document.getElementById('ulredit_data'); 
	loader.style.display = "block";
	wrap.style.display = "none";

	var form = document.getElementById('ulredit_form'); 
	send = "ajax=1&submit=1&page="+nextpage;
	for (var i = 0; i < form.childNodes.length; i++) {
		var node = form.childNodes[i];
		if ((node.nodeType === 1) && (node.nodeName.toLowerCase() == "input")) {
			fieldtype = node.getAttribute('type');
			if (fieldtype == 'hidden') {
				varname = node.getAttribute('name');
				value = node.getAttribute('value');
				send += "&";
				send += varname+"="+value;
			}
		}
	}
	
	var fields = getElementsByTagNames("input,textarea,select", wrap);
	var ids = new Array();
	for (var i=0; i < fields.length; i++) {
		var field = fields[i];		
		var varname = field.name;
		//if (varname) alert(varname);
		/* We send only what has changed */
		if (varname.substr(0,7) == "attrib_") {
			var raw = varname.split('_');
			var mid = raw[1];
			var id = raw[2];
			if (mid == "changed") {
				if (field.value == 1) ids.push(id)
			} else if (ids.in_array(id)) {
				send += "&";
				send += varname+"="+encodeURIComponent(field.value); /* Added encodeURIComponent (escape messed up unicode!) for dealing with ampersands! */ 		
			}
		}	
	}

	for (var id in newentries) {
		send += "&";
		send += "newentry_"+id+"="+newentries[id];
	}

        ajax_init();
        ajax.onreadystatechange=ulredit_submit_ajaxreply;
        ajax.open("POST",'ulr2edit.php',true);
        ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); 
	if (nextpage == 0) {
		var e = document.getElementById('ulredit_submit'); 
		e.style.display = "none";
		var e = document.getElementById('ulredit_guidelines'); 
		e.style.display = "none";
		var e = document.getElementById('ulredit_intro'); 
		e.style.display = "none";
		send = "save=1&" + send;
	}
        ajax.send(send);
}

function ulredit_submit_ajaxreply() {
        if (ajax.readyState==4) {
		var wrap = document.getElementById('ulredit_data'); 
		var loader = document.getElementById('loading_data_editor'); 
		wrap.innerHTML = ajax.responseText;
		loader.style.display = "none";
		wrap.style.display = "block";
        }
}

function ulredit_save() {
	ulredit_submit(0);	
}

function ulredit_change(id) {
	var field = document.getElementById('attrib_changed_' + id); 
	field.value = 1;
}

function ulredit_addattrib_selectform(form) {

}

function ulredit_addattrib_selecttype(type) {
	var typedesc_field = document.getElementById('ulredit_addattrib_typedesc');
	typedesc_field.innerHTML = ulredit_attribtypes[type]['description'];

	var formdesc_field = document.getElementById('ulredit_addattrib_formdesc');
	formdesc_field.innerHTML = ulredit_attribtypes[type]['forms'];
	if ('forms ' in ulredit_attribtypes[type]) {
		var formlist = "It is recommended to choose one of the following forms: ";
		for (var i=0;i<ulredit_attribtypes[type]['forms'].length;i++) {
			formlist += ' <a href="javascript:ulredit_addattrib_selectform(\''+ ulredit_attribtypes[type]['forms'][i]+'\')">'+ ulredit_attribtypes[type]['forms'][i]+'</a>';
		}
		formdesc_field.innerHTML = formlist;
	} else {
		formdesc_field.innerHTML = '';
	}
}

function ulredit_addattrib(entry_id, entry_number, baselang, variant) {
	var ver = navigator.appVersion;
	//show the add attribute dialog (doesn't add yet)
	var entry_field = document.getElementById('ulredit_addattrib_entry'); 	
	entry_field.value = entry_id;
	var number_field = document.getElementById('ulredit_addattrib_number'); 	
	number_field.value = entry_number;
	var lang_field = document.getElementById('ulredit_addattrib_lang'); 	
	if (ver.indexOf("MSIE") != -1) {
		/* Stupid IE bug renders us unable to use innerHTML for selects */
		lang_field.outerHTML = '<select id="ulredit_addattrib_lang">' + ulredit_langlist[baselang] + '</select>';
	} else {
		lang_field.innerHTML = ulredit_langlist[baselang];
	}
	var dialog = document.getElementById('ulredit_addattrib'); 
	dialog.style.display = 'block';
	
	//select proper baselang
	var options = getElementsByTagNames("option", lang_field);
	for (var i=0; i < options.length; i++) {
		if (options[i].value == baselang) {
			options[i].selected = 1;
		}
	}

	//set types
	var type_field = document.getElementById('ulredit_addattrib_type'); 
	var type_list = "";
	for (t in ulredit_attribtypes) {
		type_list += '<option value="'+t+'" onclick="ulredit_addattrib_selecttype(\''+t + '\')">' + ulredit_attribtypes[t]['name'] + '</option>';
	}
	if (ver.indexOf("MSIE") != -1) { 
		/* Stupid IE bug renders us unable to use innerHTML for selects */
		type_field.outerHTML = '<select id="ulredit_addattrib_type" onpropertychange="ulredit_addattrib_selecttype(this.value)">' + type_list + '</select>';
	} else {
		type_field.innerHTML = type_list;
	}

	var typedesc_field = document.getElementById('ulredit_addattrib_typedesc');
	typedesc_field.innerHTML = ulredit_attribtypes['orth']['description'];


	//find all available variants
	if (!variant) {
		var variant = 0;
	}
	var variant_list = "";
	var unavailable = 0;
	var newvariant = 0;
	for (var i = 0; i < 100; i++) {
		var e = document.getElementById('variant:'+baselang+':'+entry_id+':'+i);
		if (e != null) {
			unavailable = 0;
			if (i == variant) {
				variant_list += '<option value="' + i + '" selected="selected">'+i+'</option>';
			} else {
				variant_list += '<option value="' + i + '">'+i+'</option>';
			}
			newvariant = i + 1;
		} else {
			unavailable++;
			if (unavailable > 10) break;
		}
	}
	if (variant == -1) {
		variant_list += '<option value="' + newvariant + '" selected="selected">Create a new variant</option>';
	} else {
		variant_list += '<option value="' + newvariant + '">Create a new variant</option>';
	}
	var variant_field = document.getElementById('ulredit_addattrib_variant'); 	
	if (ver.indexOf("MSIE") != -1) { 
		/* Stupid IE bug renders us unable to use outerHTML */
		variant_field.outerHTML = '<select id="ulredit_addattrib_variant">' + variant_list + '</select>';
	} else {
		variant_field.innerHTML = variant_list;
	}
}


function ulredit_addattrib_add() {
	//now really add the attribute


	var ritype_field = document.getElementById('ulredit_type'); 	
	var ritype = ritype_field.value; //RI types: 'phrasebook','story', etc...

	var file_field = document.getElementById('ulredit_file'); 	
	var file = file_field.value;

	var entry_field = document.getElementById('ulredit_addattrib_entry'); 	
	var entry_id = entry_field.value;

	var number_field = document.getElementById('ulredit_addattrib_number'); 	
	var entry_number = number_field.value;

	var lang_field = document.getElementById('ulredit_addattrib_lang'); 	
	var langcode = split_language_code(lang_field.value);
	var baselang = langcode[0];
	var complexlang = langcode[1];


	var variant_field = document.getElementById('ulredit_addattrib_variant'); 	
	var variant = variant_field.value;

	var form_field = document.getElementById('ulredit_addattrib_form'); 	
	var form = form_field.value;

	var type_field = document.getElementById('ulredit_addattrib_type'); 	
	var type = type_field.value;
	var datatype = ulredit_attribtypes[type]['type'];

	var ver = navigator.appVersion;

	var variants_list = document.getElementById('variants:'+baselang+':'+entry_id);
	if (variants_list == null) {
		alert("Internal error: variant list variants:"+baselang+':'+entry_id+" does not exist. This should not occur, please contact a site administrator.");
		return false;
	}
	var variants_item = document.getElementById('variant:'+baselang+':'+entry_id+':'+variant);

	if (variants_item != null) {
		//Variant exists, check if the attribute already exists
		for (var i = 1; i <= attrib_id; i++) {
			var e = getElementByName('attrib_type_'+i);
			if (e != null) {
				var check_type = e.value;
				//alert('DEBUG: ('+check_type + ':' + type+')');
				if (check_type == type) {
					var e = getElementByName('attrib_complexlang_'+i);
					var check_complexlang = e.value;
					var e = getElementByName('attrib_form_'+i);
					var check_form = e.value;
					//alert('DEBUG: ('+check_complexlang + ':' + complexlang+') - ('+check_form + ':' + form+')');
					if ((check_complexlang == complexlang) && (check_form == form)) {
						alert("This attribute already exists. Perhaps you intented to add new another variant, another language, or another form?");
						return false;
					}
 				}
			}
		}
	} else {
		//Variant does not exist yet, create it
		variants_list.innerHTML += '<li class="variant" id="variant:'+baselang+':'+entry_id+':'+variant+'"><table class="attribs"><tbody></tbody></table>	<div class="addattrib_buttons"><img class="button" src="/images/ulredit/add.png" title="Add a new attribute" onclick="ulredit_addattrib(\''+entry_id+'\','+entry_number+', \''+baselang+'\','+variant+')" /></div></li>';
		variants_item = document.getElementById('variant:'+baselang+':'+entry_id+':'+variant);
	}
	if (variants_item == null) {
		alert("Internal error: variant item variant:"+baselang+':'+entry_id+':'+variant+" does not exist. This should not occur, please contact a site administrator.");
		return false;
	}

	//set new id (global variable), internal editor use only
	attrib_id++;
	//find the table body (strictly assuming order is <li><table><tbody>)
	var fields = getElementsByTagNames("table", variants_item);
	if (fields.length == 0) {
		alert("Internal error: table in variant:"+baselang+':'+entry_id+':'+variant+" does not exist. This should not occur, please contact a site administrator.");	return false;
	}
	var fields = getElementsByTagNames("tbody", fields[0]);
	if (fields.length == 0) {
		alert("Internal error: tbody in variant:"+baselang+':'+entry_id+':'+variant+" does not exist. This should not occur, please contact a site administrator.");	return false;
	}
	var tbody = fields[0];

	var s = '<tr id="attrib:'+attrib_id+'">';
	s += '<td class="type"><img src="/images/ulredit/attribtype_'+type+'.gif" alt="'+type+'"  title="'+ulredit_attribtypes[type]['name']+': ' + ulredit_attribtypes[type]['description'] + '" /></td>';
	s += '<td class="info">';
		s += '<div class="variant">#'+variant+'</div>';
		s += '<div class="complexlang"><img src="/images/langicons/'+lang_field.value+'.jpg" alt="'+lang_field.value+'" /> ' + baselang + complexlang + '</div>';
		s += '<div class="form">'+form+'</div>';
	s += '</td>';
	s += '<td class="value">';
		s += '<input type="hidden" name="attrib_changed_'+attrib_id+'" id="attrib_changed_'+attrib_id+'" value="1" />'; //must be first element!
		if (ulredit_attribtypes[type]['type'] == 'string') {
			s += '<textarea name="attrib_value_'+attrib_id+'" id="attrib_value_'+attrib_id+'"  title="'+ulredit_attribtypes[type]['description']+'" onchange="ulredit_change('+attrib_id+')"></textarea>';
		} else if (ulredit_attribtypes[type]['type'] instanceof Object) {
			if (ver.indexOf("MSIE") != -1) { 
				/* IE bug */
				changeproperty = "onpropertychange";
			} else {
				changeproperty = "onchange";
			}
 			s += '<select name="attrib_value_'+attrib_id+'"  title="'+ulredit_attribtypes[type]['description']+'" '+changeproperty+'="ulredit_change('+attrib_id+')" onkeyup="ulredit_change('+attrib_id+')">';
			for (key in ulredit_attribtypes[type]['type']) {
				s += '<option value="'+key+'">'+ulredit_attribtypes[type]['type'][key]+'</option>';
			}
			s += '</select>';
		//} else if (ulredit_attribtypes[type]['type'] == 'file') {
			//TODO: ADD FILE FIELD
		} else {
			alert("Sorry, adding such items is not implemented yet: " + ulredit_attribtypes[type]['type']);
			attrib_id--;
			return False;
		}

		if (type == "fill") {
			s += '<a href="javascript:ulredit_fill_addelement('+attrib_id+')" style="padding: 2px; font-size: 90%; font-weight: bold;">Insert new Fill-In Element</a>';
		}

		s += '<input type="hidden" name="attrib_baselang_'+attrib_id+'" value="'+baselang+'" />';
		s += '<input type="hidden" name="attrib_entryid_'+attrib_id+'" value="'+entry_id+'" />';
		s += '<input type="hidden" name="attrib_number_'+attrib_id+'" value="'+entry_number+'" />'
		s += '<input type="hidden" name="attrib_type_'+attrib_id+'" value="'+type+'" />';
		s += '<input type="hidden" name="attrib_variant_'+attrib_id+'" value="'+variant+'" />';
		s += '<input type="hidden" name="attrib_complexlang_'+attrib_id+'" value="'+complexlang+'" />';
		s += '<input type="hidden" name="attrib_form_'+attrib_id+'" value="'+form+'" />';
		s += '<input type="hidden" name="attrib_state_'+attrib_id+'" value="'+ulr_state_new+'" />';
	s += '</td>';
	s += '<td class="actions"> <img class="button"  src="/images/ulredit/delete.png" title="Delete this attribute" onclick="ulredit_deleteattrib('+attrib_id+')" /></td>';
	s += "</tr>";
	tbody.innerHTML += s;

	//Hide the global add-button, otherwise we have double buttons (//TODO: reshow it after all elements are deleted)
	var global_addbutton = document.getElementById('addbutton:'+baselang+':'+entry_id);
	if (global_addbutton) global_addbutton.style.display = 'none';

	/*ajax_init();
        ajax.onreadystatechange=ulredit_addattrib_ajaxreply;
        ajax.open("POST",'/unilang_ajax/ulredit_addattrib.php',true);
        ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        ajax.send('ritype='+ritype+'&file=' + file+ '&entry='+entry_id+'&baselang='+baselang+'&type='+type+'&variant='+variant+'&complexlang='+complexlang+'&form='+form);*/
	
	//hide the dialog again
	ulredit_addattrib_hide();
}


function ulredit_addattrib_hide() {
	var dialog = document.getElementById('ulredit_addattrib'); 

	dialog.style.display = 'none';
}

function ulredit_deleteattrib(attrib_id) {
	var state_field = getElementByName('attrib_state_'+attrib_id);
	var state = state_field.value;
	var row = document.getElementById('attrib:'+attrib_id);
	if (state == ulr_state_new) {
		row.innerHTML = "";
	} else if (state == ulr_state_deleted) {
		//undelete
		row.style.background = "transparent"; 
		state_field.value = ulr_state_changed;
		var value_field = getElementByName('attrib_value_'+attrib_id);
		value_field.disabled = 0;
		ulredit_change(attrib_id);
	} else {
		//delete
		row.style.background = "#9d6767"; 
		state_field.value = ulr_state_deleted;
		var value_field = getElementByName('attrib_value_'+attrib_id);
		value_field.disabled = 1;
		ulredit_change(attrib_id);
	}
}

function ulredit_addentry(number, select_type) {
	//Find the next entry_number
	var e = document.getElementById('next_number:' + number); 
	next_number = e.value; //global


	var time = new Date();
	time = time.getTime();
	document.getElementById('ulredit_addentry_id').value = 'e' + time;

	//Calculate new entry_number
	new_number = number + Math.ceil((next_number - number) / 2);
	if ((new_number == number) || (new_number == next_number)) {
		alert("Unable to add new entry here. The edit buffer is full. Please commit your changes and restart the editor");
		return false;
	}
	
	prev_number = number; //global

	//set types
	var type_field = document.getElementById('ulredit_addentry_type'); 
	var type_list = "";
	for (var i = 0; i < ulredit_entrytypes.length; i++) {
		if (ulredit_entrytypes[i] == select_type) {
			type_list += '<option value="'+ulredit_entrytypes[i]+'" selected="selected">' + ulredit_entrytypes[i] + '</option>';
		} else {
			type_list += '<option value="'+ulredit_entrytypes[i]+'">' + ulredit_entrytypes[i] + '</option>';
		}
	}
	if (ver.indexOf("MSIE") != -1) { 
		/* IE bug */
		type_field.outerHTML = '<select id="ulredit_addentry_type">' + type_list + '</select>';
	} else {
		type_field.innerHTML = type_list;
	}

	
	var dialog = document.getElementById('ulredit_addentry'); 
	dialog.style.display = 'block';
}

function ulredit_addentry_hide() {
	var dialog = document.getElementById('ulredit_addentry'); 
	dialog.style.display = 'none';

}

function ulredit_addentry_add() {

	var id_field = document.getElementById('ulredit_addentry_id'); 
	var id = id_field.value;
	
	//alert('DEBUG: prev='+prev_number+', new='+new_number+',next='+next_number);

	//validate id
	if (id.length > 33) {
		alert("The ID you specified is too long");
		return false;
	}
	for (var i = 0; i < id.length; i++) {
		var c = id.charAt(i);
		if ((c == ' ') || (c == ',') || (c == '.') || (c == '?') || (c == '^') || (c == '<') || (c == '>') || (c == '(') || (c == ')') || (c == '{') || (c == '}') || (c == '+') || (c == '[') || (c == ']') || (c == ':') || (c == ';')) {
			alert("The ID you specified contains an illegal character: '"+c+"'");
			return false;
		}
	}
	//check if the entry already exists:
	if (id in ulredit_entries) {
		alert("An entry with this ID already exists, please choose another if you intend to add a new one, or otherwise simply edit the attributes of the existing entry.");		
		return false;
	}


	var type_field = document.getElementById('ulredit_addentry_type'); 
	var type = type_field.value;

	var entrylist = document.getElementById('entrylist'); 


	//Update the next_number_field of the previous entry
	var prev_next_number_field = document.getElementById('next_number:'+prev_number);
	prev_next_number_field.value = new_number;

	//Create and insert the new entry
	var referenceNode = document.getElementById('entry:'+next_number); 
	var entry = document.createElement('li');
	entry.setAttribute('id','entry:'+new_number);
	entry.setAttribute('class','entry');
	var s = '<div class="entry panel newentry"><div class="inner"><table><tr>';
	s += '<td class="entry"><div class="id">'+id+'<input type="hidden" id="next_number:'+new_number+'" value="'+next_number+'" /></div>';
	s += '<div class="type">'+type+'<input type="hidden" name="entrytype_'+id+'" value="'+type+'" /></div>';
	s += '<div class="categories"></div>';
	s += '<div class="actions"><img  class="button"  src="/images/ulredit/delete.png" title="Delete this entire entry and all its attributes, for all languages!" /><img  class="button"  src="/images/ulredit/add.png" title="Add a new entry after this one" onclick="ulredit_addentry('+new_number+',\''+type+'\')" /></div>';		
	s += '</td>';
	for (var i = 0; i < ulredit_baselangs.length; i++) {
		s += '<td class="language"><ul class="variants" id="variants:'+ulredit_baselangs[i]+':'+id+'">';
		s += '</ul><div id="addbutton:'+ulredit_baselangs[i]+':'+id+'"  class="addattrib_buttons"><img  class="button"  src="/images/ulredit/add.png" title="Add a new attribute" onclick="ulredit_addattrib(\''+id+'\','+new_number+',\''+ulredit_baselangs[i] +'\', 0)" /></div></td>';
	}
	newentries[id] = type;
	entry.innerHTML = s;
	entrylist.insertBefore(entry, referenceNode);

	ulredit_addentry_hide();
}




/* Add a fill-in element */
function ulredit_fill_addelement(number) {
	var value = document.getElementById('attrib_value_'+number); 
	var dialog = document.getElementById('ulredit_fill_addelement'); 
	document.getElementById('ulredit_fill_addelement_correct').value = "";
	document.getElementById('ulredit_fill_addelement_incorrect').value = "";
	document.getElementById('ulredit_fill_addelement_hint').value = "";
	document.getElementById('ulredit_fill_addelement_cue').value = "";

	fill_addelement_number = number;
	dialog.style.display = 'block';
}

function ulredit_fill_addelement_add() {
	var correct = document.getElementById('ulredit_fill_addelement_correct').value;

	var cue = document.getElementById('ulredit_fill_addelement_cue').value;
	var hint = document.getElementById('ulredit_fill_addelement_hint').value;


	var incorrect = document.getElementById('ulredit_fill_addelement_incorrect').value;
	var text;
	if (incorrect != "") {
		incorrect = incorrect.split("\n");
		text = "{" + correct +"\\" + incorrect.join("\\") + "\\" + cue + "\\" + hint + "}"
	} else {
		text = "{" + correct + "\\" + cue + "\\" + hint + "}"
	}
	ulredit_fill_addelement_insert(fill_addelement_number,text);
	ulredit_fill_addelement_hide();
}

function ulredit_fill_addelement_hide() {
	var dialog = document.getElementById('ulredit_fill_addelement'); 
	dialog.style.display = 'none';
}


/**
* Insert text at position
*/
function ulredit_fill_addelement_insert(number, text)
{
	var textarea = document.getElementById('attrib_value_'+number); 

	//text = ' ' + text + ' ';
	
	
	if (!isNaN(textarea.selectionStart))
	{
		var sel_start = textarea.selectionStart;
		var sel_end = textarea.selectionEnd;

		mozWrap(textarea, text, '')
		textarea.selectionStart = sel_start + text.length;
		textarea.selectionEnd = sel_end + text.length;
	}
	else if (textarea.createTextRange && textarea.caretPos)
	{
		if (baseHeight != textarea.caretPos.boundingHeight) 
		{
			textarea.focus();
			storeCaret(textarea);
		}

		var caret_pos = textarea.caretPos;
		caret_pos.text = caret_pos.text.charAt(caret_pos.text.length - 1) == ' ' ? caret_pos.text + text + ' ' : caret_pos.text + text;
	}
	else
	{
		textarea.value = textarea.value + text;
	}
	if (!popup) 
	{
		textarea.focus();
	}
}

/**
* From http://www.massless.org/mozedit/
*/
function mozWrap(txtarea, open, close)
{
	var selLength = txtarea.textLength;
	var selStart = txtarea.selectionStart;
	var selEnd = txtarea.selectionEnd;
	var scrollTop = txtarea.scrollTop;

	if (selEnd == 1 || selEnd == 2) 
	{
		selEnd = selLength;
	}

	var s1 = (txtarea.value).substring(0,selStart);
	var s2 = (txtarea.value).substring(selStart, selEnd)
	var s3 = (txtarea.value).substring(selEnd, selLength);

	txtarea.value = s1 + open + s2 + close + s3;
	txtarea.selectionStart = selEnd + open.length + close.length;
	txtarea.selectionEnd = txtarea.selectionStart;
	txtarea.focus();
	txtarea.scrollTop = scrollTop;

	return;
}

/**
* Insert at Caret position. Code from
* http://www.faqts.com/knowledge_base/view.phtml/aid/1052/fid/130
*/
function storeCaret(textEl)
{
	if (textEl.createTextRange)
	{
		textEl.caretPos = document.selection.createRange().duplicate();
	}
}



