var finder = {
  myConn: false, // the XMLHttpRequest
  myConnFile: 'finder.aspx',
  language: false,
  resetText: 'Reset',
  resetTextFR: 'Réinitialiser',
  noOptionsText: 'No options available',
  noOptionsTextFR: 'Aucune option',
  selects: false,
  init: function() {
    if (!document.getElementById ||
        !document.getElementsByTagName ||
        !document.createElement ||
        !document.createTextNode ||
        !document.getElementById('formfinder')) {
      return;
    }

    // Set and test XHConn
    finder.myConn = new XHConn();
    if(!finder.myConn) return;

    // Add onchange event to selects
    finder.selects = finder.getSelects();
    for (var i = 0; i < finder.selects.length; i++) {
      finder.addEvent(finder.selects[i], 'change', finder.getSelected);
    }

    // Create reset link
    /*
    finder.language = finder.getLanguage();
    var reset = (finder.language == 'en') ?
      finder.resetText : finder.resetTextFR;
    var text = document.createTextNode(reset);
    var anchor = document.createElement('a');
    anchor.setAttribute('href', '#');
    anchor.className = 'reset';
    anchor.appendChild(text);
    anchor = document.getElementById('formfinder').appendChild(anchor);
    finder.addEvent(anchor, 'click', finder.reset);
    */
    var reset = document.getElementById('reset');
    finder.addEvent(reset, 'click', finder.reset);
  },
  getSelected: function(event) {
    var params = '';
    //params = this.id + '=' + this.options[this.selectedIndex].value;

    var selectLength = finder.selects.length;
    for (var i = 0; i < selectLength; i++) {
      var select = finder.selects[i];
      var key = select.getAttribute('id');
      var value = (event) ? select.options[select.selectedIndex].value : '0';
      params += key + '=' + value;
      params += (i != selectLength-1) ? '&' : '';
    }

    // Use XHConn's connect method
    finder.myConn.connect(finder.myConnFile, 'POST', params, finder.replaceOptions);
  },
  replaceOptions: function(oXML) {
    // Test response
    if (!oXML.responseXML) return false;
    // Replace options
    var optionElem = document.createElement('option');
    var xmlSelects = oXML.responseXML.getElementsByTagName('select');
    for (var i = 0; i < xmlSelects.length; i++) {
      // Remove existing XHTML option nodes
      while (finder.selects[i].lastChild) {
        if (finder.selects[i].lastChild.nodeType == '1' &&
            finder.selects[i].lastChild.getAttribute('value') == '') {
          break;
        }
        finder.selects[i].removeChild(finder.selects[i].lastChild);
      }
      // Append XML option nodes
      // Note: Tests to append cloned XML nodes problematic...
      // rebuilding nodes instead
      var xmlOptions = xmlSelects[i].getElementsByTagName('option');
      for (var j = 0; j < xmlOptions.length; j++) {
        var option = optionElem.cloneNode(false);
        var selected = xmlOptions[j].getAttribute('selected');
        if (selected) {
          option.setAttribute('selected', selected);
        }
        var value = xmlOptions[j].getAttribute('value');
        option.setAttribute('value', value);
        var text = document.createTextNode(xmlOptions[j].firstChild.nodeValue);
        option.appendChild(text);
        finder.selects[i].appendChild(option);

        // TEST:
        // Append cloned XML node
        // Note: Seems to work only for Mozilla
        // ------------------------------------
        // var node = xmlOptions[j].cloneNode(true);
        // finder.selects[i].appendChild(node);
      }
      // TEST:
      // Fix (for Mozilla): Cloned XML nodes not interpreted as XHTML
      // ------------------------------------------------------------
      // finder.selects[i].innerHTML = finder.selects[i].innerHTML;

      if (xmlOptions.length == 0) {
        var option = optionElem.cloneNode(false);
        option.setAttribute('value', '0');
        finder.language = finder.getLanguage();
        var noOptions = (finder.language == 'en') ? finder.noOptionsText : finder.noOptionsTextFR;
        var text = document.createTextNode(noOptions);
        option.appendChild(text);
        finder.selects[i].appendChild(option);
      }
    }
  },
  reset: function(event) {
    finder.stopEvent(event);
    finder.getSelected();
  },
  getLanguage: function() {
    var htmlElement = document.getElementsByTagName('html')[0];
    return htmlElement.getAttribute('xml:lang');
  },
  getSelects: function() {
    var theForm = document.getElementById('formfinder');
    var selects = theForm.getElementsByTagName('select');
    return selects;
  },
  addEvent: function(obj, type, fn) {
    if (obj.addEventListener) {
      obj.addEventListener(type, fn, false);
    } else if (obj.attachEvent) {
      obj['e'+type+fn] = fn;
      obj[type+fn] = function() {
        obj['e'+type+fn](window.event);
      }
      obj.attachEvent('on'+type, obj[type+fn]);
    }
  },
  stopEvent: function(event) {
    if (event.preventDefault) {
      event.preventDefault();
      event.stopPropagation();
    } else {
      event.returnValue = false;
      event.cancelBubble = true;
    }
  }
}

finder.addEvent(window, 'load', finder.init);