// $Id: suggest.js 2713 2011-10-20 17:31:49Z nbt $
// nbt, 28.2.08

/*global YAHOO, document, window */

YAHOO.namespace('zbw.stw');
(YAHOO.zbw.stw.suggest = function () {

  "use strict";

  // MSIE doesn't accept const
  var SUGGEST_URL, suggest_ds, auto_comp, select_handler, data_error_handler, 
    data_return_handler, textbox_key_handler, result_count, not_found_message, 
    lang, stw_version, get_url;

  // URL must point to the same domain where the current page resides
  // (due to browser security restrictions)
  // address can be redirected to http://zbw.eu/beta/stw-ws/suggest
  // in the web server configuration (reverse proxy settings)

  SUGGEST_URL = '/beta/stw-ws/suggest';

  // configure the data source
  suggest_ds = new YAHOO.util.XHRDataSource(SUGGEST_URL);
  suggest_ds.responseType = YAHOO.util.XHRDataSource.TYPE_JSON;
  suggest_ds.responseSchema = {
    resultsList : "results.bindings", // String pointer to result data
    // N.B. fields have sub-structures (type, value)
    fields : [ "term", "concept", "prefLabel" ]
  };

  // configure the autocomplete component
  auto_comp = new YAHOO.widget.AutoComplete("suggest_input", "suggest_output", suggest_ds);
  auto_comp.allowBrowserAutocomplete = false; 
  auto_comp.minQueryLength = 2;
  lang = document.getElementById('lang').value;
  stw_version = document.getElementById('stw_version').value;
  auto_comp.generateRequest = function (sQuery) {
    return "?lang=" + lang + "&query=" + sQuery;
  };

  // Result data passed as object for easy access from custom formatter.
  auto_comp.resultTypeList = false;

  // Customize formatter to show prefLabel or term -> prefLabel
  auto_comp.formatResult = function (oResultData, sQuery, sResultMatch) {
    var result;
    if (oResultData.term.value === oResultData.prefLabel.value) {
      result = oResultData.prefLabel.value;
    } else {
      result = oResultData.term.value + ' &' + '#8594; ' + oResultData.prefLabel.value;
    }
    return result;
  };

  // Define an event handler to execute any actions on the result data
  select_handler = function (sType, aArgs) {
    var oData, concept_uri, action_url; 

    //var myAC = aArgs[0]; // reference back to the AC instance
    //var elLI = aArgs[1]; // reference to the selected LI element
    oData = aArgs[2]; // object literal of selected item's result data
      
    // Reset input field
    auto_comp.getInputEl().value = '';

    // set the target address (specific to current lang and stw_version)
    concept_uri = oData.concept.value;
    action_url = get_url(concept_uri, lang, stw_version);

    window.location.href = action_url;
    return;
  };
  auto_comp.itemSelectEvent.subscribe(select_handler);

  // Define an event handler to cope with data errors
  data_error_handler = function (sType, sArgs) {
    auto_comp.getInputEl().value = '-- Data error on server! --';
  };
  // seems to work only on data source, not on autocomplete
  auto_comp.dataErrorEvent.subscribe(data_error_handler);

  // Define an event handler for handling empty results
  data_return_handler = function (sType, sArgs) {
    result_count = sArgs[2].length;
    if (result_count === 0) {
      auto_comp = sArgs[0];
      lang = document.getElementById('lang').value;
      not_found_message = (lang === 'de') ?       
          "Keine Treffer" : "No matching results";
      not_found_message = "<div id=i\"not_found_message\">-- " 
        + not_found_message + " --<\/div>";
      auto_comp.setBody(not_found_message);
      // simply .expandContainer() doesn't work here, because it is
      // collapsed afterwards, so we have to turn off collapsing completely
      auto_comp.alwaysShowContainer = true;
      auto_comp.expandContainer();
    }
  };
  auto_comp.dataReturnEvent.subscribe(data_return_handler);

  // Define an event handler on key press 
  // to reset .alwaysShowContainer, which was possibly enabled 
  // in data_return_handler when returned data was empty
  textbox_key_handler = function (sType, sArgs) {
    auto_comp = sArgs[0];
    auto_comp.alwaysShowContainer = false;
    auto_comp.collapseContainer();
  };
  auto_comp.textboxKeyEvent.subscribe(textbox_key_handler);

  // make version and language choise sticky
  get_url = function (concept_uri, lang, stw_version) {
    var pos, stw_base_uri, concept, version;

    pos = concept_uri.indexOf('/stw/');
    stw_base_uri = concept_uri.substring(0, pos + 5);
    concept = concept_uri.substring(pos + 5);

    if (document.URL.match(/\/latest\//)) {
      version = 'latest';
    } else {
      version = stw_version;
    }

    return stw_base_uri + 'versions/' + version + '/' + concept + '/about.' + lang + '.html';
  };

  return;
}());


