function insertTab(o, e)
{
	var kC = e.keyCode ? e.keyCode : e.charCode ? e.charCode : e.which;
	if (kC == 9 && !e.shiftKey && !e.ctrlKey && !e.altKey)
	{
		var oS = o.scrollTop;
		if (o.setSelectionRange)
		{
			var sS = o.selectionStart;
			var sE = o.selectionEnd;
			o.value = o.value.substring(0, sS) + "\t" + o.value.substr(sE);
			o.setSelectionRange(sS + 1, sS + 1);
			o.focus();
		}
		else if (o.createTextRange)
		{
			document.selection.createRange().text = "\t";
			e.returnValue = false;
		}
		o.scrollTop = oS;
		if (e.preventDefault)
		{
			e.preventDefault();
		}
		return false;
	}
	return true;
}

/*
Functions used by Online LaTeX Equation Editor for inserting expressions
myField - the <textarea> element in the calling page.
*/

// pos: optional parameter defining where in inserted text to put the caret
function insertText( txt, pos )
{
	myField = document.getElementById('latex_formula')
	// if pos==1000 then using style options and move to just before final
	if (pos==1000)(pos=txt.length-1);
	// if undefined put at end of inserted text
	if (pos==undefined)(pos=txt.length);
	
	// startPos: final position of caret in complete text
	if (document.selection) 	{
		// IE
		myField.focus();
		var sel = document.selection.createRange();
		// find current caret position
		var i = myField.value.length+1; 
		theCaret = sel.duplicate(); 
		while (theCaret.parentElement()==myField 
		&& theCaret.move("character",1)==1) --i; 
	
		// take account of line feeds
		var startPos = i - myField.value.split('\n').length + 1 ; 
	
		if (txt.substring(1,5) == "left" && sel.text.length)	{ 
			// allow highlighted text to be bracketed
			pos = txt.length + sel.text.length + 1;
			sel.text = txt.substring(0,7) + sel.text + txt.substr(6);	     
		} else {
			sel.text = txt;
		}
		// put caret in correct position to start editing
		var range = myField.createTextRange();
		range.collapse(true);
		range.moveEnd('character', startPos + pos);
		range.moveStart('character', startPos + pos);
		range.select();
	}
	else
	{
		// MOZILLA
		if (myField.selectionStart || myField.selectionStart == '0')	{
			var startPos = myField.selectionStart;
			var endPos = myField.selectionEnd;
			var cursorPos = startPos + txt.length;
			if (txt.substring(1,5) == "left" && endPos > startPos)	{ 
				// allow highlighted text to be bracketed
				pos = txt.length + endPos - startPos + 1;
				txt = txt.substring(0,7) + myField.value.substring(startPos, endPos) + txt.substr(6);	     
			}
			myField.value = myField.value.substring(0, startPos) + txt + myField.value.substring(endPos, myField.value.length);
			myField.selectionStart = cursorPos;
			myField.selectionEnd = cursorPos;
			// put caret in correct position to start editing
			myField.focus();
			myField.setSelectionRange(startPos + pos,startPos + pos);	      
		}
		else	
			myField.value += txt;
	}
	myField.focus();
}

// generate a set of aligned equations - thornahawk
// isNumbered: switches between numbered and not numbered equations
function makeEquations( type, isNumbered )
{
	if (isNumbered==undefined)(isNumbered=false);
	var eqns="\n\n\\begin{"+type+((isNumbered)?"":"*")+"}"
	var eqi="\n  {}&=&{} "
	var eqEnd="\n\\end{"+type+((isNumbered)?"":"*")+"}"
	var i=0

	var dim = prompt('Enter the number of equations:', '')

	if (dim != '' && dim != null)	{
		n=parseInt(dim)
		if (!isNaN(n)) {
			for (i=1;i<=n-1;i++)	{
				eqns=eqns+(eqi+"\\\\ ")
			}
			eqns=(eqns+eqi)+eqEnd
			
			insertText(eqns,type.length+((isNumbered)?0:1)+15)
		}
		else
			insertText('')
	}
	else
		insertText('')
}

// generate an array of specified dimensions - thornahawk
// type: sets the type of array, e.g. pmatrix
function makeArray( type )
{
	var matr="\\begin{"+type+"}"
	var row="\n{}"
	var mend="\n\\end{"+type+"}"
	var i=0

	var dim = prompt('Enter the array dimensions separated by a comma (e.g., 2,3):', '')

	if (dim != '' && dim != null)	{
		dim=dim.split(',')
		m=parseInt(dim[0])
		n=parseInt(dim[1])
		
		if (!isNaN(m) && !isNaN(n)) {
			for (i=2;i<=n;i++)	{
				row=row+"&{}"
			}
			for (i=1;i<=m-1;i++)	{
				matr=matr+(row+"\\\\ ")
			}
			matr=(matr+row)+mend
			
			insertText(matr,type.length+11)
		}
		else
			insertText('')
	}
	else
		insertText('')
}
/*GNU GPL*/