var ss_form_element = 'aspnetForm'; // search form
var ss_popup_element = 'search_suggest'; // search suggestion drop-down
var ss_seq = [ 'g' ];
var ss_g_one_name_to_display =
    "";
var ss_g_more_names_to_display =
    "";
var ss_g_max_to_display = 10;
var ss_max_to_display = 10;
var ss_wait_millisec = 30;
var ss_delay_millisec = 30;
var ss_gsa_host = null;
var SS_OUTPUT_FORMAT_LEGACY = 'legacy';
var SS_OUTPUT_FORMAT_OPEN_SEARCH = 'os';
var SS_OUTPUT_FORMAT_RICH = 'legacy';
var ss_protocol = SS_OUTPUT_FORMAT_RICH;
var ss_allow_non_query = true;
var ss_non_query_empty_title =
    "Aucun titre";
var ss_allow_debug = false;
var ss_cached = [];
var ss_qbackup = null;
var ss_qshown = null;
var ss_loc = -1;
var ss_waiting = 0;
var ss_painting = false;
var ss_key_handling_queue = null;
var ss_painting_queue = null;
var ss_dismissed = false;
var ss_panic = false;
var SS_ROW_CLASS = 'ss-gac-a';
var SS_ROW_SELECTED_CLASS = 'ss-gac-b';

if (!Array.indexOf) {
   Array.prototype.indexOf = function(obj) {
    for (var i = 0; i < this.length; i++) {
      if (this[i] == obj) {
        return i;
      }
    }
    return -1;
  };
}
var ss_debug = new ss_Debugger();

function ss_composeSuggestUri(qVal, suggestForm) {
  var siteVal = 'PP_Jpg';
  var clientVal = 'PP_Jpg';
  var accessVal = 'a';
      
  var uri = '/suggest.aspx';
  if (SS_OUTPUT_FORMAT_LEGACY == ss_protocol) {
    uri = uri + '?token=' + encodeURIComponent(qVal) +
        '&max_matches=' + ss_g_max_to_display;
  } else {
    uri = uri + '?q=' + encodeURIComponent(qVal) +
        '&max=' + ss_g_max_to_display;
  }
  return uri;
}

function ss_suggest(qVal) {
   
  var startTimeMs = new Date().getTime();
  if (!ss_cached[qVal]) {
    ss_cached[qVal] = {};
  }
  var suggestForm = document.getElementById(ss_form_element);
  var uri = ss_composeSuggestUri(qVal, suggestForm);
  if (!uri) {
    return;
  }
 
  var url = ss_gsa_host ? 'http://' + ss_gsa_host + uri : uri;
  if (ss_panic) {
    alert('ss_suggest() AJAX: ' + url);
  }

  var xmlhttp = XH_XmlHttpCreate();
   
  var handler = function() {
   
    if (xmlhttp.readyState == XML_READY_STATE_COMPLETED) {
      if (ss_panic) {
        alert('ss_suggest() AJAX: ' + xmlhttp.responseText);
      }
      var suggested;
     
      try {
        suggested = eval('(' + xmlhttp.responseText + ')');
      } catch (e) {
        ss_cached[qVal].g = null;

        ss_show(qVal);
        return;
      }
      if (ss_use.g) {
        try {
           
          switch (ss_protocol) {
            case SS_OUTPUT_FORMAT_LEGACY:
            
            default:
              var suggestions = suggested;
              if (suggestions && suggestions.length > 0) {
                var found = false;
                ss_cached[qVal].g = [];
                var max = (ss_g_max_to_display <= 0) ?
                    suggestions.length :
                    Math.min(ss_g_max_to_display, suggestions.length);
                for (var si = 0; si < max; si++) {
                  ss_cached[qVal].g[si] = { 'q': suggestions[si] };
                  found = true;
                 
                }
                if (!found) {
                  ss_cached[qVal].g = null;
                }
              } else {
                ss_cached[qVal].g = null;
              }
              
              break;
            case SS_OUTPUT_FORMAT_OPEN_SEARCH:
              if (suggested.length > 1) {
                var suggestions = suggested[1];
                if (suggestions && suggestions.length > 0) {
                  var found = false;
                  ss_cached[qVal].g = [];
                  var max = (ss_g_max_to_display <= 0) ?
                      suggestions.length :
                      Math.min(ss_g_max_to_display, suggestions.length);
                  for (var si = 0; si < max; si++) {
                    if (suggestions[si] && suggestions[si] != suggested[0]) {
                      ss_cached[qVal].g[si] = { 'q': suggestions[si] };
                      found = true;
                    } else if ((suggested.length > 3) && ss_allow_non_query) {
                      var title = (suggested[2].length > si) ?
                          null : suggested[2][si];
                      var url = (suggested[3].length > si) ?
                          null : suggested[3][si];
                      if (url) {
                        title = !title ? ss_non_query_empty_title : title;
                        ss_cached[qVal].g[si] = { 't': title, 'u': url };
                        found = true;
                      }
                    }
                  }
                  if (!found) {
                    ss_cached[qVal].g = null;
                  }
                } else {
                  ss_cached[qVal].g = null;
                }
              } else {
                ss_cached[qVal].g = null;
              }
              break;
            case SS_OUTPUT_FORMAT_RICH:
              var suggestions = suggested.results;
              if (suggestions && suggestions.length > 0) {
                var found = false;
                ss_cached[qVal].g = [];
                var max = (ss_g_max_to_display <= 0) ?
                    suggestions.length :
                    Math.min(ss_g_max_to_display, suggestions.length);
                for (var si = 0; si < max; si++) {
                  if (suggestions[si].name &&
                      suggestions[si].name != suggested.query) {
                    ss_cached[qVal].g[si] = { 'q': suggestions[si].name };
                    found = true;
                  } else if (ss_allow_non_query) {
                    var title = suggestions[si].content;
                    var url = suggestions[si].moreDetailsUrl;
                    if (url) {
                      title = !title ? ss_non_query_empty_title : title;
                      ss_cached[qVal].g[si] = { 't': title, 'u': url };
                      found = true;
                    }
                  }
                }
                if (!found) {
                  ss_cached[qVal].g = null;
                }
              } else {
                ss_cached[qVal].g = null;
              }
              break;
          }
        } catch (e) {
          ss_cached[qVal].g = null;
        }
      }
      
      if (ss_allow_debug && ss_debug && ss_debug.getDebugMode()) {
        var stopTimeMs = new Date().getTime();
        ss_debug.addRequestDebugLine(qVal, 'suggest',
                                     stopTimeMs - startTimeMs, ss_cached[qVal]);
      }

      ss_show(qVal);
    }
  };
  XH_XmlHttpPOST(xmlhttp, url, '', handler);
}

function ss_processed(qVal) {
  if (!ss_cached[qVal] && ss_use.g) {
    return false;
  }
  return true;
}

function ss_handleAllKey(e) {
  var kid = (window.event) ? window.event.keyCode : e.keyCode;
  switch (kid) {
    case 40:  // "key down".
    case 38:  // "key up".
      break;
    case 9:  // "tab".
    case 16:  // "shift-tab".
      ss_qbackup = null;
      ss_dismissed = true;
      ss_clear(true);  // Focusing away, must not grab focus back to the search box.
      var qry = document.getElementById(ss_form_element).ctl00$ch$slb1$uc1$tbProductSearch.value;
      if (!ss_processed(qry)) {
        if (ss_panic) {
          alert('run ajax when key off');
        }
        ss_suggest(qry);
      }
      break;
    case 113:  // "F2".
      if (!ss_allow_debug) {
        break;
      }
      if (ss_debug && ss_debug.getDebugMode()) {
        ss_debug.deactivateConsole();
      } else {
        ss_debug.activateConsole();
      }
      break;
    default:
      break;
  }
}

function ss_handleKey(e) {
  var kid = (window.event) ? window.event.keyCode : e.keyCode;
  var fo = document.getElementById(ss_form_element);
  
  var qnow = (!ss_qbackup) ? fo.ctl00$ch$slb1$uc1$tbProductSearch.value : ss_qbackup;
  var sum = 0;
  var tbl = document.getElementById(ss_popup_element);
  switch (kid) {
    case 40:  // "key down".
      ss_dismissed = false;
      if (ss_processed(qnow)) {
        sum = ss_countSuggestions(qnow);
        if (sum > 0) {
          if (tbl.style.visibility == 'hidden') {
            ss_show(qnow);
            break;
          }
          if (ss_qbackup) {
            ss_loc++;
          } else {
            ss_qbackup = qnow;
            ss_loc = 0;
          }
          while (ss_loc >= sum)
            ss_loc -= sum;
          var rows = tbl.getElementsByTagName('tr');
          for (var ri = 0; ri < rows.length - 1; ri++) {
            if (ri == ss_loc) {
              rows[ri].className = SS_ROW_SELECTED_CLASS;
            } else {
              rows[ri].className = SS_ROW_CLASS;
            }
          }

          var suggestion = ss_locateSuggestion(qnow, ss_loc);

          if (suggestion.q) {
            fo.ctl00$ch$slb1$uc1$tbProductSearch.value = suggestion.q;
          } else {
            fo.ctl00$ch$slb1$uc1$tbProductSearch.value = ss_qbackup;
          }
        }
      } else {
        if (ss_panic) {
          alert('run ajax when key down');
        }
        ss_suggest(qnow);
      }
      break;
    case 38:  // "key up".
      ss_dismissed = false;
      if (ss_processed(qnow)) {
        sum = ss_countSuggestions(qnow);
        if (sum > 0) {
          if (tbl.style.visibility == 'hidden') {
            ss_show(qnow);
            break;
          }
          if (ss_qbackup) {
            ss_loc--;
          } else {
            ss_qbackup = qnow;
            ss_loc = -1;
          }
          while (ss_loc < 0)
            ss_loc += sum;
          var rows = tbl.getElementsByTagName('tr');
          for (var ri = 0; ri < rows.length - 1; ri++) {
            if (ri == ss_loc) {
              rows[ri].className = SS_ROW_SELECTED_CLASS;
            } else {
              rows[ri].className = SS_ROW_CLASS;
            }
          }

          var suggestion = ss_locateSuggestion(qnow, ss_loc);

          if (suggestion.q) {
            fo.ctl00$ch$slb1$uc1$tbProductSearch.value = suggestion.q;
          } else {
            fo.ctl00$ch$slb1$uc1$tbProductSearch.value = ss_qbackup;
          }
        }
      } else {
        if (ss_panic) {
          alert('run ajax when key up');
        }
        ss_suggest(qnow);
      }
      break;
    case 13:  // "enter".
      var url = null;
      if (ss_processed(qnow) && ss_qbackup && ss_loc > -1) {
        var suggestion = ss_locateSuggestion(ss_qbackup, ss_loc);
        if (suggestion.u) {
          url = suggestion.u;
        }
      }
      ss_qbackup = null;
      ss_dismissed = true;
      ss_clear();
      if (url) {
        window.location.href = url;
      }
      break;
    case 27:  // "escape".
      if (ss_qbackup) {
        fo.ctl00$ch$slb1$uc1$tbProductSearch.value = ss_qbackup;
        ss_qbackup = null;
      }
      ss_dismissed = true;
      ss_clear();
      break;
    case 37:  // "key left".
    case 39:  // "key right".
    case 9:  // "tab".
    case 16:  // "shift-tab".
      break;
    default:
      ss_dismissed = false;
      if (fo.ctl00$ch$slb1$uc1$tbProductSearch.value == ss_qshown) {
      } else {
        if (ss_key_handling_queue) {
          clearTimeout(ss_key_handling_queue);
        }
        ss_qbackup = null;
        ss_loc = -1;
        // Flow through for delayed AJAX calls.
        ss_waiting++;
        if (ss_allow_debug && ss_debug && ss_debug.getDebugMode()) {
          ss_debug.addWaitDebugLine(fo.ctl00$ch$slb1$uc1$tbProductSearch.value, 'queue', ss_wait_millisec);
        }
        ss_key_handling_queue = setTimeout(
            'ss_handleQuery("' + ss_escape(fo.ctl00$ch$slb1$uc1$tbProductSearch.value) + '", ' +
            ss_waiting + ')', ss_wait_millisec);
      }
      break;
  }
}

function ss_handleQuery(query, waiting1) {
  if (waiting1 != ss_waiting) return;
  ss_waiting = 0;
  if (query == '') {
    ss_clear();
  } else if (!ss_processed(query)) {
    if (ss_panic) {
      alert('run ajax when key change');
    }
    ss_suggest(query);
  } else {
    ss_show(query);
  }
}

function ss_sf() {
  document.getElementById(ss_form_element).ctl00$ch$slb1$uc1$tbProductSearch.focus();
  ss_dismissed = false;
}

function ss_clear(nofocus) {
  ss_qshown = null;
  var fo = document.getElementById(ss_form_element);
  var qnow = (!ss_qbackup) ? fo.ctl00$ch$slb1$uc1$tbProductSearch.value : ss_qbackup;
  ss_hide(qnow);
  if (!nofocus) {
    ss_sf();
  }
}

function ss_hide(qry) {
  var tbl = document.getElementById(ss_popup_element);
  if (tbl.style.visibility == 'visible') {
    if (ss_panic) {
      alert('close suggestion box');
    }
    if (ss_allow_debug && ss_debug && ss_debug.getDebugMode()) {
      ss_debug.addHideDebugLine(qry, 'hide');
    }
    tbl.style.visibility = 'hidden';
  }
}

function ss_show(qry) {
  var currentQry = document.getElementById(ss_form_element).ctl00$ch$slb1$uc1$tbProductSearch.value;

  if (currentQry != qry) {
    if (ss_allow_debug && ss_debug && ss_debug.getDebugMode()) {
      ss_debug.addHideDebugLine(qry, 'skip');
    }
    return;
  }

  var startTimeMs = new Date().getTime();
  if (ss_dismissed) {
    ss_qshown = null;
    ss_hide(qry);
    return;
  }

  if (!ss_processed(qry)) {
    return;
  }

  if (qry == '') {
    ss_hide(qry);
    return;
  }

  var g = ss_cached[qry] ? ss_cached[qry].g : null;
  var disp = false;
  if (ss_use.g && g) {
    disp = true;
  }
  if (!disp) {
    ss_qshown = null;
    ss_hide(qry);
    return;
  }
  if (ss_painting) {
    if (ss_painting_queue) {
      clearTimeout(ss_painting_queue);
    }
    if (ss_allow_debug && ss_debug && ss_debug.getDebugMode()) {
      ss_debug.addWaitDebugLine(qry, 'delay', ss_delay_millisec);
    }
    ss_painting_queue = setTimeout('ss_show("' + ss_escape(qry) + '")',
                                   ss_delay_millisec);
    return;
  } else {
    ss_painting = true;
  }
  var tbl = document.getElementById(ss_popup_element);
  for (var ri = tbl.rows.length - 1; ri > -1; ri--) {
    tbl.deleteRow(ri);
  }
  var cnt = 0;
  for (var z = 0; z < ss_seq.length; z++) {
    switch (ss_seq[z]) {
      case 'g':
        cnt += ss_showSuggestion(g, cnt, tbl);
        break;
    }
    if (ss_max_to_display > 0 && cnt >= ss_max_to_display) {
      break;
    }
  }
  if (cnt > 0) {
    var row = tbl.insertRow(-1);
    row.className = 'ss-gac-e';
    var cls = document.createElement('td');
    cls.colSpan = 2;
    var clsTxt = document.createElement('span');
    clsTxt.onclick = function() {
      ss_qbackup = null;
      ss_clear();  // This will always turn off ss_dismiss after bring search box into focus.
      var query = document.getElementById(ss_form_element).ctl00$ch$slb1$uc1$tbProductSearch.value;
      if (!ss_processed(query)) {
        ss_dismissed = true;
        if (ss_panic) {
          alert('run ajax when mouse close');
        }
        ss_suggest(query);
      }
    };
    tbl.style.visibility = 'visible';
    ss_qshown = qry;
    if (ss_panic) {
      alert('open suggestion box for ' + qry);
    }
    if (ss_allow_debug && ss_debug && ss_debug.getDebugMode()) {
      var stopTimeMs = new Date().getTime();
      ss_debug.addShowDebugLine(qry, stopTimeMs - startTimeMs,
                                ss_cached[qry], cnt);
    }
  } else {
    ss_hide(qry);
  }
  ss_painting = false;
}

function ss_showSuggestion(g, cnt, tbl) {

  if (ss_max_to_display > 0 && cnt >= ss_max_to_display) {
    return 0;
  }
  if (g && g.length > 0) {
    for (var i = 0; i < g.length; i++) {
      var row = tbl.insertRow(-1);
      row.onclick = ss_handleMouseC;
      row.onmousemove = ss_handleMouseM;
      row.className = SS_ROW_CLASS;
      var alt = document.createElement('td');
      if (g[i].q) {
        alt.appendChild(document.createTextNode(g[i].q));
      } else {
        alt.innerHTML = '<i>' + g[i].t + '</i>';
      }
      alt.className = 'ss-gac-c';
      row.appendChild(alt);
      var clue = '';
      if (i == 0 && g.length == 1) {
        clue = ss_g_one_name_to_display;
      } else if (i == 0) {
        clue = ss_g_more_names_to_display;
      }
      var typ = document.createElement('td');
      typ.appendChild(document.createTextNode(clue));
      typ.className = 'ss-gac-d';
      row.appendChild(typ);
      if (ss_max_to_display > 0 && cnt + i + 1 >= ss_max_to_display) {
        return i + 1;
      }
    }
    ss_sf();
    return g.length;
  }
  return 0;
}

function ss_handleMouseM() {
  var fo = document.getElementById(ss_form_element);
  var tbl = document.getElementById(ss_popup_element);
  var rows = tbl.getElementsByTagName('tr');
  for (var ri = 0; ri < rows.length - 1; ri++) {
    if (rows[ri] == this && rows[ri].className != SS_ROW_SELECTED_CLASS) {
      rows[ri].className = SS_ROW_SELECTED_CLASS;
      if (!ss_qbackup) {
        ss_qbackup = fo.ctl00$ch$slb1$uc1$tbProductSearch.value;
      }
      ss_loc = ri;
      var suggestion = ss_locateSuggestion(ss_qbackup, ss_loc);
      if (suggestion.q) {
        fo.ctl00$ch$slb1$uc1$tbProductSearch.value = suggestion.q;
      } else {
        fo.ctl00$ch$slb1$uc1$tbProductSearch.value = ss_qbackup;
      }
    } else if (rows[ri] != this) {
      rows[ri].className = SS_ROW_CLASS;
    }
  }
  ss_sf();
  return true;
}

function ss_handleMouseC() {
  var fo = document.getElementById(ss_form_element);
  var tbl = document.getElementById(ss_popup_element);
  var rows = tbl.getElementsByTagName('tr');
  for (var ri = 0; ri < rows.length - 1; ri++) {
    if (rows[ri] == this) {
      if (!ss_qbackup) {
        ss_qbackup = fo.ctl00$ch$slb1$uc1$tbProductSearch.value;
      }
      ss_loc = ri;
      var suggestion = ss_locateSuggestion(ss_qbackup, ss_loc);
      if (suggestion.q) {
        fo.ctl00$ch$slb1$uc1$tbProductSearch.value = suggestion.q;
        tbl.style.visibility = 'hidden';
        ss_clear();
      } else {
        fo.ctl00$ch$slb1$uc1$tbProductSearch.value = ss_qbackup;
        if (suggestion.u) {
          window.location.href = suggestion.u;
        }
      }
      break;
    }
  }
}

function ss_countSuggestions(query) {
  var cnt = 0;
  for (var i = 0; i < ss_seq.length; i++) {
    switch (ss_seq[i]) {
      case 'g':
        cnt += ss_cached[query].g ? ss_cached[query].g.length : 0;
        break;
    }
    if (ss_max_to_display > 0 && cnt >= ss_max_to_display) {
      return ss_max_to_display;
    }
  }
  return cnt;
}

function ss_locateSuggestion(query, loc) {
  var cnt1 = 0;
  var cnt2 = 0;
  var type = null;
  for (var z = 0; z < ss_seq.length; z++) {
    switch (ss_seq[z]) {
      case 'g':
        cnt2 += ss_cached[query].g ? ss_cached[query].g.length : 0;
        break;
    }
    if (loc >= cnt1 && loc < cnt2) {
      switch (ss_seq[z]) {
        case 'g':
          var qV = ss_cached[query].g[loc - cnt1].q;
          if (qV) {
            return { 'q': qV };
          } else {
            return { 'u': ss_cached[query].g[loc - cnt1].u };
          }
      }
      break;
    }
    cnt1 = cnt2;
  }
  return null;
}

function ss_escape(query) {
  return query.replace(/\\/g, '\\\\').replace(/\"/g, '\\\"');
}

function ss_escapeDbg(query) {
  var escapedQuery = '';
  var ch = query.split('');
  for (var i = 0; i < ch.length; i++) {
    switch (ch[i]) {
      case '&':
        escapedQuery += '&amp;';
        break;
      case '<':
        escapedQuery += '&lt;';
        break;
      case '>':
        escapedQuery += '&gt;';
        break;
      default:
        escapedQuery += ch[i];
        break;
    }
  }
  return escapedQuery;
}

function ss_Debugger() {
  this.debugMode = false;
}

var ss_use = {};
ss_use.g = true ;

document.onkeyup = ss_handleAllKey;

var XH_ieProgId_;
var XML_READY_STATE_UNINITIALIZED = 0;
var XML_READY_STATE_LOADING = 1;
var XML_READY_STATE_LOADED = 2;
var XML_READY_STATE_INTERACTIVE = 3;
var XML_READY_STATE_COMPLETED = 4;

function XH_XmlHttpInit_() {
  var XH_ACTIVE_X_IDENTS = ["MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.3.0",
                            "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];

  if (typeof XMLHttpRequest == "undefined" &&
      typeof ActiveXObject != "undefined") {
    for (var i = 0; i < XH_ACTIVE_X_IDENTS.length; i++) {
      var candidate = XH_ACTIVE_X_IDENTS[i];

      try {
        new ActiveXObject(candidate);
        XH_ieProgId_ = candidate;
        break;
      } catch (e) {
      }
    }

    if (!XH_ieProgId_) {
      throw Error("Could not create ActiveXObject. ActiveX might be disabled," +
                  " or MSXML might not be installed.");
    }
  }
}

XH_XmlHttpInit_();

function XH_XmlHttpCreate() {
  if (XH_ieProgId_) {
    return new ActiveXObject(XH_ieProgId_);
  } else {
    return new XMLHttpRequest();
  }
}

function XH_XmlHttpGET(xmlHttp, url, handler) {
  xmlHttp.open("GET", url, true);
  xmlHttp.onreadystatechange = handler;
  XH_XmlHttpSend(xmlHttp, null);
}

function XH_XmlHttpPOST(xmlHttp, url, data, handler) {
  xmlHttp.open("POST", url, true);
  xmlHttp.onreadystatechange = handler;
  xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  xmlHttp.setRequestHeader("Content-Length",
      /** @type {string} */ (data.length));
  XH_XmlHttpSend(xmlHttp, data);
}

function XH_XmlHttpOpen(xmlHttp, verb, url, handler) {
  xmlHttp.open(verb, url, true);
  xmlHttp.onreadystatechange = handler;
}

function XH_XmlHttpSetRequestHeader(xmlHttp, name, value) {
  xmlHttp.setRequestHeader(name, value);
}

function XH_XmlHttpSend(xmlHttp, data) {
  try {
    xmlHttp.send(data);
  } catch (e) {
    log('XMLHttpSend failed ' + e.toString() + '<br>' + e.stack);
    throw e;
  }
}

function XH_XmlHttpAbort(xmlHttp) {
  SafeTimeout(window, function() {
    xmlHttp.onreadystatechange = function() {};
  }, 0);
  if (xmlHttp.readyState < XML_READY_STATE_COMPLETED) {
    xmlHttp.abort();
  }
}


