


function addEvent(obj, evType, fn){ 
  if (obj.addEventListener){ 
    obj.addEventListener(evType, fn, false); 
    return true; 
  } else if (obj.attachEvent){ 
    var r = obj.attachEvent("on"+evType, fn); 
    return r; 
  } else { 
    return false; 
  } 
}
addEvent(window, 'load', onLoadStart);

var previousStart = -1;


function onLoadStart() {
  Event.observe('keyword', 'keypress', listScroll, false);    
  Event.observe('keyword', 'keyup', getKeywords, false);    
}

function getKeywords(e) {
  if (!e) var e = window.event;
  if (e.keyCode) code = e.keyCode;
  else if (e.which) code = e.which;
  if (code == Event.KEY_DOWN || code == Event.KEY_UP || code == 16) {
  /*    $('result').value +=  "don't download"; */
  }else if (code == Event.KEY_TAB) {
  // 2007.5.22 Tokoro add
  } else if (code == Event.KEY_ESC) {
    Element.hide(keywordList);
  } else {
    current = $F('keyword');
//    var pars = 'current=' + escape(current);
    var pars = 'current=' + encodeURIComponent(current);
    /*remove wild if we decide we don't want it */
    pars += '&wild=true';
    /* replace following after testing */

    var url = '/PosMed/KeywordListServlet';
    var myAjax = new Ajax.Updater(
                        {success: 'boxes'}, 
                        url, 
                        {
                          method: 'get', 
                          parameters: pars, 
                          onFailure: reportError
                        }); 
  }
}


function setCaretPosition(oField, iCaretStart, iCaretEnd)
{
  // IE Support
  if (document.selection)
  {
    // Focus on the text box
    oField.focus();
    var oSel = document.selection.createRange();
    oSel.moveStart ('character', -oField.value.length);
    oSel.moveEnd ('character', -oField.value.length);
    if(iCaretEnd != null)
      oSel.moveEnd ('character', iCaretEnd);
    else
      oSel.moveEnd ('character', iCaretStart);
    oSel.moveStart ('character', iCaretStart);
    // Everything thus far has just been on our object in
    // memory - this line actually updates the browser
    oSel.select();
  }
  // Firefox support
  else if(oField.selectionStart || oField.selectionStart == '0')
  {
    oField.selectionStart = iCaretStart;
    if(iCaretEnd != null)
      oField.selectionEnd = iCaretEnd;
    else
      oField.selectionEnd = iCaretStart;
    oField.focus();
  }
}

function reportError(request) {
  Element.hide(keywordList);
}

/*
    Called when user presses a key
    while in the text field
*/
function listScroll(e) {
  if (!e) var e = window.event;
  if (e.keyCode) code = e.keyCode;
  else if (e.which) code = e.which;
  keywordList = $('keywordList');
  if (!keywordList) {
    return;
  }
  if (code == Event.KEY_DOWN) {
    index = keywordList.selectedIndex;
    if (index < (keywordList.length - 1)) {
      keywordList.selectedIndex += 1;
      updateInput('false');
    }
  } else if (code == Event.KEY_UP) {
    if (keywordList.selectedIndex > 0) {
      keywordList.selectedIndex -= 1;
      updateInput('false');
    }
  } else if (code == Event.KEY_TAB) {
    pos = $('keyword');
    start = getStart(pos);
    previousStart = start;
    end = getEnd(pos);
    keywordList.selectedIndex = 0;
    updateInput('false');
    // 2007.5.22 Tokoro add
  } else if (code == Event.KEY_ESC) {
    return false;
  }
}

/*
    Called when user clicks a keyword list item
*/
function updateInput(clearList) {
  newInputString = $F('keywordList');
  if (newInputString == null || newInputString == "") {
    return;
  }
  $('keyword').focus();
  pos = $('keyword');
  start = getStart(pos);
  end = getEnd(pos);
  if (start == 0 && end == 0) {
    return;
  }
  var url = '/PosMed/KeywordListServlet';
  var pars = 'requestType=merge';
//  pars += '&current=' + escape(current);
//  pars += '&newString=' + escape(newInputString);
  pars += '&current=' + encodeURIComponent(current);
  pars += '&newString=' + encodeURIComponent(newInputString);
  pars += '&start=' + start;
  pars += '&end=' + end;
  if (clearList == 'true') {
    var myAjax = new Ajax.Request(
                     url, 
                     {
                       method: 'get', 
                       parameters: pars, 
                       onComplete: updateAndClear
                     });
  } else {
    var myAjax = new Ajax.Request(
                     url, 
                     {
                       method: 'get', 
                       parameters: pars, 
                       onComplete: update
                     });
  }
}

function updateAndClear(response) {
  keywordList = $('keywordList');
  while (keywordList.hasChildNodes()) {
    keywordList.removeChild(keywordList.firstChild);
  }
  Element.hide(keywordList);
  $('keyword').value = response.responseText;
}

function update(response) {
  keywordText = $('keyword');
  keywordText.value = response.responseText;
  setCaretPosition(keywordText, keywordText.value.length,  keywordText.value.length);
}
    
/* can remove getStart, getEnd if we only allow appending new words */
function getStart(o) {
  if (o.createTextRange) {
    var r = document.selection.createRange().duplicate();
    r.moveEnd('character', o.value.length);
    if (r.text == '') return o.value.length;
    return o.value.lastIndexOf(r.text);
  } else {
    return o.selectionStart;
  }
}

function getEnd(o) {
  if (o.createTextRange) {
    var r = document.selection.createRange().duplicate();
    r.moveStart('character', -o.value.length);
    return r.text.length;
  } else return o.selectionEnd;
}
