
function queryBuilder_wireUpEvents(senderId)
{
  var sender = queryBuilder_getRoot(getElement(senderId));

  var textBox = queryBuilder_getTextBox(sender);
  var operatorList = queryBuilder_getOperatorList(sender);
  var fieldList = queryBuilder_getFieldList(sender);


  for(var k = 0; k < fieldList.childNodes.length; k++)
  {
    if (fieldList.childNodes[k].className != 'empty')
    {   
      addHandler(fieldList.childNodes[k].childNodes[0], 'onclick', queryBuilder_onFieldClick);
      addHandler(fieldList.childNodes[k], 'onclick', queryBuilder_onFieldClick);
      addHandler(fieldList.childNodes[k], 'onmouseover', queryBuilder_onMouseOver);
      addHandler(fieldList.childNodes[k], 'onmouseout', queryBuilder_onMouseOut);
    }
  }
  for(var k = 0; k < operatorList.childNodes.length; k++)
  {
    if (operatorList.childNodes[k].className != 'empty')
    {
      if (getAttributeValue(operatorList.childNodes[k], 'arg') == '*')
      {
        addHandler(operatorList.childNodes[k].childNodes[0], 'onclick', queryBuilder_onWildcardClick);
        addHandler(operatorList.childNodes[k], 'onclick', queryBuilder_onWildcardClick);
      }
      else
      {
        addHandler(operatorList.childNodes[k].childNodes[0], 'onclick', queryBuilder_onOperatorClick);
        addHandler(operatorList.childNodes[k], 'onclick', queryBuilder_onOperatorClick);
      }
      addHandler(operatorList.childNodes[k], 'onmouseover', queryBuilder_onMouseOver);
      addHandler(operatorList.childNodes[k], 'onmouseout', queryBuilder_onMouseOut);
    }
  }
  
  addHandler(textBox, 'onclick', queryBuilder_updateSelection);
  addHandler(textBox, 'onselect', queryBuilder_updateSelection);
  addHandler(textBox, 'onfocus', queryBuilder_updateSelection);
  addHandler(textBox, 'onkeyup', queryBuilder_updateSelection);
  addHandler(textBox, 'onkeydown', queryBuilder_onKeyPress);
}

function queryBuilder_getRoot(sender)
{
  while (sender != null && getAttributeValue(sender, 'key') != 'advancedTextBox')
    sender = getParent(sender);
    
  return sender;
}

function queryBuilder_getTextBox(sender)
{
  return getElementByKeyAndTagName(queryBuilder_getRoot(sender), 'text', 'INPUT');
}

function queryBuilder_getOperatorList(sender)
{
  return getElementByKeyAndTagName(queryBuilder_getRoot(sender), 'operatorList', 'UL');
}

function queryBuilder_getFieldList(sender)
{
  return getElementByKeyAndTagName(queryBuilder_getRoot(sender), 'fieldList', 'UL');
}

function queryBuilder_getSelectionStart(sender)
{
  var start = getAttributeValue(queryBuilder_getRoot(sender), 'ss');
  if (start == '')
    return 0;
  else
    return start;
}

function queryBuilder_setSelectionStart(sender, selectionStart)
{
  setAttributeValue(queryBuilder_getRoot(sender), 'ss', selectionStart);
}

function queryBuilder_getSelectionEnd(sender)
{
  var end = getAttributeValue(queryBuilder_getRoot(sender), 'se');
  if (end == '')
    return 0;
  else
    return end;
}

function queryBuilder_setSelectionEnd(sender, selectionEnd)
{
  setAttributeValue(queryBuilder_getRoot(sender), 'se', selectionEnd);
}


function queryBuilder_onFieldClick(e)
{
  e = getEvent(e);
  var sender = getSender(e);
  if (sender.tagName != 'LI')
    sender = getParent(sender);
    
  var textBox = queryBuilder_getTextBox(sender);
  var text = getAttributeValue(sender, 'arg');

  var selectionStart = queryBuilder_getSelectionStart(sender);
  var selectionEnd = queryBuilder_getSelectionEnd(sender);
  if (selectionStart == selectionEnd || !isIE)
  {
    textBox.value += ' ' + text;
    queryBuilder_setCaretPos(textBox, textBox.value.length - 1);
    queryBuilder_updateSelection(e);
  }
  else
  {
    textBox.focus();
    var range = document.selection.createRange();
    range.moveStart('character', selectionStart);
    range.moveEnd('character', selectionEnd - selectionStart);
    range.text = text;
    queryBuilder_updateSelection(e);
    range.select();
  
  }
  
  abortEvent(e);
  return false;
}

function queryBuilder_onOperatorClick(e)
{
  e = getEvent(e);
  var sender = getSender(e);
  
  if (sender.tagName != 'LI')
    sender = getParent(sender);
    
  var textBox = queryBuilder_getTextBox(sender);
  var text = getAttributeValue(sender, 'arg');
  
  var selectionStart = queryBuilder_getSelectionStart(sender);
  var selectionEnd = queryBuilder_getSelectionEnd(sender);
  
  textBox.focus();
  if (selectionStart == selectionEnd || !isIE)
  {
    textBox.value += ' ' + text;
    queryBuilder_setCaretPos(textBox, textBox.value.length - 1);
    queryBuilder_updateSelection(e);
  }
  else
  {
    var range = document.selection.createRange();
    range.moveStart('character', selectionStart);
    range.moveEnd('character', selectionEnd - selectionStart);
    range.text = text;
    queryBuilder_updateSelection(e);
    range.select();
  }
  
  abortEvent(e);
  return false;
}


function queryBuilder_onWildcardClick(e)
{
  e = getEvent(e);
  var sender = getSender(e);
  
  if (sender.tagName != 'LI')
    sender = getParent(sender);
    
  var textBox = queryBuilder_getTextBox(sender);
  var text = getAttributeValue(sender, 'arg');
  var selectionStart = queryBuilder_getSelectionStart(sender);
  var selectionEnd = queryBuilder_getSelectionEnd(sender);
  textBox.focus();
  if (!isIE)
  {
    textBox.value += text;
    queryBuilder_setCaretPos(textBox, textBox.value.length - 1);
    queryBuilder_updateSelection(e);
  }
  else if (selectionStart == selectionEnd)
  {
    var range = document.selection.createRange();
    range.text = text;
    queryBuilder_updateSelection(e);
    range.select();
  }
  else
  {
    var range = document.selection.createRange();
    range.moveStart('character', selectionStart);
    range.moveEnd('character', selectionEnd - selectionStart);
    range.text = text;
    queryBuilder_updateSelection(e);
    range.select();
  }
  
  abortEvent(e);
  return false;
}

function queryBuilder_setCaretPos(textBox, position)
{
  if (textBox.selectionStart)
  {
    textBox.selectionStart = position;
    textBox.selectionEnd = position;
  }
  else
  {
    var range = textBox.createTextRange();
    range.moveStart('character', position);
    range.collapse();
    range.select();
  }
}

function queryBuilder_findSelectionStart(textBox) 
{
	if (isIE)
	{
	  var range = document.selection.createRange();
		var isCollapsed = range.compareEndPoints("StartToEnd", range) == 0;
	  if (!isCollapsed)
		  range.collapse(true);
	  var b = range.getBookmark();
	  return b.charCodeAt(2) - 2;
	}
	else
	  return textBox.selectionStart;
}

function queryBuilder_findSelectionEnd(textBox) 
{
  if (isIE)
  {
    var range = document.selection.createRange();
	  var isCollapsed = range.compareEndPoints("StartToEnd", range) == 0;
	  if (!isCollapsed)
		  range.collapse(false);
	  var b = range.getBookmark();
	  return b.charCodeAt(2) - 2;  
  }
  else
	  return textBox.selectionEnd;
}

function queryBuilder_updateSelection(e)
{

  e = getEvent(e);
  var sender = getSender(e);
  var textBox = queryBuilder_getTextBox(sender)
  if (document.activeElement == textBox || sender == textBox)
  {
    queryBuilder_setSelectionStart(sender, queryBuilder_findSelectionStart(textBox));
    queryBuilder_setSelectionEnd(sender, queryBuilder_findSelectionEnd(textBox));
  }
  //window.status = queryBuilder_findSelectionStart(textBox) + ' -> ' + queryBuilder_findSelectionEnd(textBox);
}

function queryBuilder_clear(e)
{
  e = getEvent(e);
  var sender = getSender(e);
  var textBox = queryBuilder_getTextBox(sender);
  textBox.value = '';
  textBox.focus(); 
}

function queryBuilder_close(e)
{
  e = getEvent(e);
  var sender = getSender(e);
  var root = queryBuilder_getRoot(sender);
  
  var div = getElementByKeyAndTagName(root, 'contents', 'DIV');
  advancedTextBox_collapse(div);
  getElementByKeyAndTagName(root, 'text', 'INPUT').focus();
  
}

function queryBuilder_onMouseOver(e)  
{  
  e = getEvent(e);
  var sender = getSender(e);
  if (sender.tagName != 'LI')
    sender = getParent(sender);
  sender.className = 'hover';
}  

function queryBuilder_onMouseOut(e)  
{  
  e = getEvent(e);
  var sender = getSender(e);
  if (sender.tagName != 'LI')
    sender = getParent(sender);
  sender.className = '';
} 

function queryBuilder_onKeyPress(e)
{
  e = getEvent(e);
  var sender = getSender(e);
  if (e.keyCode == 27)
  {
    abortEvent(e);
    queryBuilder_close(e);
  }
  
  var key = String.fromCharCode(e.keyCode);
  if (key == '')
    return false;
    
  key = key.toLowerCase();
  var needsAlt = false;
  var needsCtrl = false;
  var target = '';
          
  if (e.altKey || e.ctrlKey)
  {
    var links = queryBuilder_getRoot(sender).getElementsByTagName('LI');
    for (var k = 0; k < links.length; k++)
    {
      var hotkey = getAttributeValue(links[k], 'hotkey');
      if (hotkey != '')
      {
        needsAlt = false;
        needsCtrl = false;
        target = '';
        var keys = hotkey.split('+');
        for (i = 0; i < keys.length; i++)
        {
          switch(keys[i].toLowerCase())
          {
            case 'alt' :
              needsAlt = true;
              break;
            case 'ctrl' :
              needsCtrl = true;
              break;
            default :
              target = keys[i].toLowerCase();
              break;
          }
        }
        if (needsAlt == e.altKey && needsCtrl == e.ctrlKey && key == target)
        {
          links[k].childNodes[0].click();
          abortEvent(e);
          return true;
        }
      }  
    }
  }
}
