function QueryEditor(){};
	
QueryEditor.init = function( editorElementId, functionSelectionElementId, formId, validationStatusNotValidated )
{
    QueryEditor.editorElementId = editorElementId;
    QueryEditor.functionSelectionElementId = functionSelectionElementId;
    QueryEditor.formId = formId;
    QueryEditor.validationStatusNotValidated = validationStatusNotValidated;
}

QueryEditor.getSelectedFunction = function()
{
    functionSelectElement = document.getElementById(QueryEditor.functionSelectionElementId);
    if (!functionSelectElement)
        return null;
        
    if (functionSelectElement.options.length == 0)
        return null;

    return functionSelectElement.options[functionSelectElement.selectedIndex].value;
}

QueryEditor.insertCode = function( name, value, insertCurlyBangDelims )
{
    restoreSelection(document.getElementById(name));
    var insert = (insertCurlyBangDelims && !findDelimiters(name, '{!', '}')) ? '{!' + value + '}' : ' ' + value + ' ';
    insertTextAtSelectionInEditor(name, insert);
}

function getCursorPosition(field)
{
	if (document.selection) {
	    var range = document.selection.createRange();
	    // We'll use this as a 'dummy'
	    var stored_range = range.duplicate();
	    stored_range.moveToElementText(field);
	    stored_range.setEndPoint('EndToEnd', range);
	    var selectionStart = stored_range.text.length - range.text.length;
	    var selectionEnd = selectionStart + range.text.length;
	    return { start: selectionStart, end: selectionEnd };
	} else {
	    return null;
	}
}

function setCursorPosition(field, pos)
{
   if (field.createTextRange) {
      var range = field.createTextRange();
      range.move('textedit', -1);

      if (pos.end != pos.start) {
          range.moveStart('character', pos.start);
          range.moveEnd('character', pos.end);
      } else {
          range.move('character', pos.start);
      }

      range.select();
   }
}

function saveSelection(textArea)
{
	textArea.previousSelection = getCursorPosition(textArea);
}

function restoreSelection(textArea)
{
	if (textArea && textArea.previousSelection) {
	    textArea.focus();
	    setCursorPosition(textArea, textArea.previousSelection);
	}
}

function getTextAreaSelection(textArea)
{
	textArea.focus();
	
	var bits = ['', textArea.value, '', ''];
	
	if (document.selection) {
	    if (textArea.previousSelection) {
	        var pos = textArea.previousSelection;
	        bits[1] = textArea.value.substring(0, pos.start);
	        bits[2] = textArea.value.substring(pos.start, pos.end);
	        bits[3] = textArea.value.substring(pos.end)
	      }
	} else {
	    bits = (new RegExp('([\\s\\S]{' + textArea.selectionStart + '})([\\s\\S]{' +
	        (textArea.selectionEnd - textArea.selectionStart) + '})([\\s\\S]*)')).exec(textArea.value);
	}

	return bits;
}

function insertTextAtSelectionInEditor(textAreaName, value)
{
	var textArea = document.getElementById(textAreaName);
	
	bits = getTextAreaSelection(textArea);
	
	if (bits)
	{
	    textArea.value = bits[1] + value + bits[3];
	
	    // Update the current cursor location to be just after the value
	    var endOfInsertion = (bits[1].length + value.length);
	    if (document.selection) {
	        var tr = textArea.createTextRange();
	        tr.move('textedit', -1);
	        tr.collapse();
	        tr.move('character', endOfInsertion);
	        tr.select();
	
	        saveSelection(textArea);
	    }
	    else
	    {
	        textArea.selectionStart = endOfInsertion;
	        textArea.selectionEnd = textArea.selectionStart;
	    }

	    textArea.focus();
    }
}
