document.autosuggestUrls = {
  'companySearch' : '/suggestCompany',
  'searchTicker' : '/suggestIssue',
  'selectIssue' : '/suggestIssue',
  'tickerValue' : '/suggestIssue',
  'tickerSearch' : '/suggestIssue',
  'issueCompare' : '/suggestIssue',
  'buyerSearch' : '/ar/suggestBroker',
  'sellerSearch' : '/ar/suggestBroker'};

document.autosuggestFields = new Array();

// Data for autosuggest fields.
function data()
{
  this.searchReq = getXmlHttpRequestObject();
 //Search string, typed by the user; used to bold matching part of the suggestion item
  this.searchStr = '';
 //currently active item from the suggestion list ,
  //i.e. the item user points with the mouse or item marked using up and down arrows
  this.selectedSuggItem = -1;
 //count of the returned suggestions
  this.suggestionsCount = 0;
  this.textFieldID = '';
  this.divID = '';
  this.element = false;
}
function isSuggestionSelected(event) {
  var el = event.currentTarget || event.srcElement;
  var dataObj = null;
  if (el) {
    dataObj = document.autosuggestFields[el.name];
    if (!dataObj)
    {
      dataObj = new data();
      dataObj.textFieldID = el.name;
      dataObj.divID = el.name + '_suggest';
      dataObj.element = el;
      document.autosuggestFields[el.name] = dataObj;
    }
  }

  if (!dataObj) return;
  if (event.keyCode == 9) {
    clearSuggestDiv(dataObj);
  }
  if (event.keyCode == 13 && dataObj.selectedSuggItem == -1 && el && el.value && el.value.length > 0)
  {
    var formForEl = getFormForElement(el);
    if (formForEl)
      formForEl.submit();
    return;
  }
  if (event.keyCode == 13 && dataObj.selectedSuggItem != -1) {
    var selDiv = document.getElementById('suggitem' + dataObj.selectedSuggItem);
    var selDivId = '';
    for (var i = 0; i < selDiv.firstChild.attributes.length; i++) {
      if (selDiv.firstChild.attributes[i].nodeName == 'id') {
        selDivId = selDiv.firstChild.attributes[i].nodeValue;
        break;
      }
    }
    var tc1 = selDiv.childNodes[0].textContent ? selDiv.childNodes[0].textContent : selDiv.childNodes[0].innerText;
    var tc2 = selDiv.childNodes[1].textContent ? selDiv.childNodes[1].textContent : selDiv.childNodes[1].innerText;
    setSearch('' + dataObj.textFieldID, selDivId,
            '' + tc1 + ' - ' + tc2 + '');
    dataObj.selectedSuggItem = -1;
  }
}

//Called from keyup on the search textbox.
//Starts the AJAX request.
function searchSuggest(event, txtFieldId)
{
  var el = event.currentTarget || event.srcElement;
  var dataObj = null;

  if (el) {
    dataObj = document.autosuggestFields[el.name];
  }

   //close all suggestion divs, except current.
  for (var key in document.autosuggestFields) {
    var tmpObj = document.autosuggestFields[key];
    if (dataObj.textFieldID != tmpObj.textFieldID) {
      clearSuggestDiv(tmpObj);
    }
  }

 	 //isSuggestionSelected(event);
  if (dataObj.searchReq.readyState == 4 || dataObj.searchReq.readyState == 0) {
    var KeyID = event.keyCode;

    if (KeyID == 27) { //Escape
      clearSuggestDiv(dataObj);
    } else if (KeyID == 38) { //Arrow Up
      moveSelectionUp(dataObj);
      return false;
    } else if (KeyID == 40) { //Arrow Down
      moveSelectionDown(dataObj);
      return false;
    } else if (KeyID == 13) { //Enter
      return false;
    } else {
      var str = document.getElementById(dataObj.textFieldID).value;
      dataObj.searchStr = str;
      str = str.replace(/^\s+|\s+$/, '');
      if (str == '' /*|| str.length < 2*/) {
        clearSuggestDiv(dataObj);
        return;
      }
      var suggestUrl = document.autosuggestUrls[dataObj.textFieldID];
      if( dataObj.textFieldID.indexOf( '_' ) != -1 )
        suggestUrl = document.autosuggestUrls[dataObj.textFieldID.substr(0,dataObj.textFieldID.indexOf('_'))];
      if (!suggestUrl) return;

      dataObj.searchReq.open("GET", suggestUrl + '?search=' + str, true);
      dataObj.searchReq.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=windows-1251');
      dataObj.searchReq.onreadystatechange = function () {

        if (dataObj.searchReq.readyState == 4) {

          var ss = document.getElementById(dataObj.divID);
          clearSuggestDiv(dataObj);
          if (dataObj.searchReq.responseText == '') return;
          var str = dataObj.searchReq.responseText.split("\n");

          dataObj.suggestionsCount = str.length;
          var searchedStrToUpper = dataObj.searchStr.toUpperCase();
          var searchedStrLength = dataObj.searchStr.length;
          for (i = 0; i < dataObj.suggestionsCount; i++) {
            //Build our element string.  This is cleaner using the DOM, but
            //IE doesn't support dynamically added attributes.
            var strTmp = str[i];
            var els = strTmp.split('\t');
            if (els.length != 3) {
              continue;
            }

            var setSearchVal = '';
            var codeDisplVal = '';

            setSearchVal = els[0];
            var companyName = els[1];
            var companyPIC = els[2];

            /*  if (els[0] == '') {
              setSearchVal = codeDisplVal = els[1];
            } else {
              setSearchVal = els[0];
              codeDisplVal = els[0] + ' / ' + els[1];
            }*/

            var suggest = '<div onmouseover="javascript:suggestOver(this);" ';
            suggest += 'onmouseout="javascript:suggestOut(this);" ';
            suggest += 'onclick="javascript:setSearch(\'' + dataObj.textFieldID + '\', \'' + setSearchVal + '\', \'' + companyName + ' - ' + companyPIC + '\');" ';
            suggest += 'class="suggest_link" id="suggitem' + i + '">';
            suggest += '<div class="code" id="' + setSearchVal + '">' + boldMatch(companyName, searchedStrToUpper, searchedStrLength) + '</div>';
            suggest += '<div class="name">' + boldMatch(companyPIC, searchedStrToUpper, searchedStrLength) + '</div>';
            suggest += '<div class="clear"/></div>';
            ss.innerHTML += suggest;
          }
          if (str.length) {
            ss.style.display = '';
          }
        }
      }
      dataObj.searchReq.send(null);
    }
  }
}
function boldMatch(suggStr, searchedStrToUpper, searchedStrLength) {
  var pos = suggStr.toUpperCase().indexOf(searchedStrToUpper);

  if (pos != -1) {
    return suggStr.substr(0, pos) + '<strong>' + suggStr.substr(pos, searchedStrLength) + '</strong>' + suggStr.substr(pos + searchedStrLength);
  }

  return suggStr;
}

function clearSuggestDiv(dataObj) {
  //alert(divID);
  var ss = document.getElementById(dataObj.divID)
  if (ss) {
    ss.innerHTML = '';
    ss.style.display = 'none';
  }
  dataObj.selectedSuggItem = -1;
}

//Mouse over function
function suggestOver(div_value) {
  div_value.className = 'suggest_link_over';
  div_value.style.cursor = 'pointer';
}

//Mouse out function
function suggestOut(div_value) {
  div_value.className = 'suggest_link';
  div_value.style.cursor = 'default';
}

//Click function
function setSearch(txtFieldID, value, displayValue) {
  var dataObj = document.autosuggestFields[txtFieldID];
  if (!dataObj) return;
  var selValue = value;
  document.getElementById(txtFieldID).value = displayValue;
  var suggestDiv = document.getElementById(dataObj.divID);
  suggestDiv.style.display = 'none';
  suggestDiv.innerHTML = '';
  dataObj.selectedSuggItem = -1;

  /*tickerRegExp = /^[A-Z1-9]+/;
  tickerMatch = tickerRegExp.exec(selValue);
  brokerCodeRegExp = /^[0-9]{3,}|COB/;
  brokerCodeMatch = brokerCodeRegExp.exec(selValue);*/
  if (dataObj.textFieldID == 'companySearch') {
    if (selValue != null) {
      document.companies.company_id.value = selValue/*tickerMatch*/;
      document.companies.submit();
    }
  } /* else if (dataObj.textFieldID == 'issueCompare') {
    if (selValue != null) {
      document.compare.ticker.value = selValue;
    }
    document.compare.submit();
  } else if (dataObj.textFieldID == 'selectIssue') {
    if (selValue != null) {
      document.frmTicker.ticker.value = selValue;
    }
  } else if (dataObj.textFieldID == 'searchTicker') {
    if (selValue != null)
    {
      var el = document.getElementById('f_ticker');
      if (el)
        el.value = selValue;
    }
  } else if (dataObj.textFieldID == 'tickerValue') {
    if (selValue != null) {
      document.announcements.ticker.value = selValue;
    }
  } else if (dataObj.textFieldID == 'tickerSearch') {
    if (selValue != null) {
      document.filters.ticker.value = selValue;
    }
  } else if (dataObj.textFieldID == 'companySearch' || dataObj.textFieldID.substr(1,13) == "companySearch") {
    if (selValue != null) {
      document.transactions.ticker.value = selValue;
    }
    document.transactions.submit();
  } else if (dataObj.textFieldID.indexOf('selectIssue_') != -1) {
    if (selValue != null) {
      var row = dataObj.textFieldID.replace("selectIssue_","");
      document.getElementById("ticker_" + row).value = selValue;
    }
  }*/

  /* else if (dataObj.textFieldID == 'buyerSearch') {
    if (brokerCodeMatch != null) {
      document.transactions.buyer.value = brokerCodeMatch;
    }
    document.transactions.submit();
  } else if (dataObj.textFieldID == 'sellerSearch') {
    if (brokerCodeMatch != null) {
      document.transactions.seller.value = brokerCodeMatch;
    }
    document.transactions.submit();
  }*/
}

//moveSelectionDown function - Changes selection on suggestion list when user uses down arrow
function moveSelectionDown(dataObj) {
  //alert(suggestionsCount);
  if (dataObj.suggestionsCount == 1 || dataObj.selectedSuggItem == dataObj.suggestionsCount - 1) {
    dataObj.selectedSuggItem = 0;
  } else {
    dataObj.selectedSuggItem++;
  }
  document.getElementById('suggitem' + dataObj.selectedSuggItem).className = 'suggest_link_over';
  if (dataObj.selectedSuggItem > 0) {
    document.getElementById('suggitem' + (dataObj.selectedSuggItem - 1)).className = 'suggest_link';
  } else if (dataObj.selectedSuggItem == 0) {
    document.getElementById('suggitem' + (dataObj.suggestionsCount - 1)).className = 'suggest_link';
  }
  return false;
}

//moveSelectionUp function - Changes selection on suggestion list when user uses up arrow
function moveSelectionUp(dataObj) {
  if (dataObj.selectedSuggItem <= 0) {
    dataObj.selectedSuggItem = dataObj.suggestionsCount - 1;
  } else {
    dataObj.selectedSuggItem--;
  }
  document.getElementById('suggitem' + dataObj.selectedSuggItem).className = 'suggest_link_over';
  if (dataObj.selectedSuggItem < dataObj.suggestionsCount - 1) {
    document.getElementById('suggitem' + (dataObj.selectedSuggItem + 1)).className = 'suggest_link';
  } else if (dataObj.selectedSuggItem == dataObj.suggestionsCount - 1) {
    document.getElementById('suggitem0').className = 'suggest_link';
  }
  return false;
}
