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; } } } } }