
  var allValues ;
  var noneValues ;
  var selectedValues ;
  var fieldPrefix ;
  var fields ;
  var searchType ;
  var optionsCache = new Array() ;

  function init() {
  	fieldPrefix = searchType + "Search_" ;
  	DWREngine.setPreHook(beginWait);
	DWREngine.setPostHook(endWait);
    selectedValues = new Array() ;
    for(i=0; i<fields.length; i++) {
    	selectedValues[fields[i]] = allValues[fields[i]] ;
    	
	  	var list = DWRUtil.getElementById(fieldPrefix + fields[i]) ;

		if (DWRUtil.isHTMLSelectElement(list)) {
		  	optionsCache[fields[i]] = new Array() ;
	  	
	  		for (var j=0; j<list.options.length; j++) {
		  		optionsCache[fields[i]][j] = new Array() ;
    			optionsCache[fields[i]][j].text = list.options[j].text ;
    			optionsCache[fields[i]][j].value = list.options[j].value ;
    		}
    	}
    	
    }
  }

  // used in specimensearch onblur
  function f(id) {
  	  var fieldName = id.replace(fieldPrefix, '') ;
  	  var value = DWRUtil.getValue(id) ;
      selectedValues[fieldName] = value ;
  }
  
  function update(list)
  {
  	  var fieldName = list.id.replace(fieldPrefix, '') ;
  	  var value = DWRUtil.getValue(list.id) ;
      
      if (value == noneValues[fieldName]) {
      	DWRUtil.setValue(list.id, allValues[fieldName]);
      	return ;
      }

      selectedValues[fieldName] = value ;

	  updateSearchForm() ;
  }

  function updateSearchForm() {
      var selectedValuesStr = "" ;
      
      // !!!! if value or names contains these
      // tester avant ou plutot utiliser regex cote serveur ?
      var fieldSeparator = "###" ;
      var nameValueSeparator = "@@@" ;
      
      for (var field in selectedValues)
      	selectedValuesStr += field + nameValueSeparator + selectedValues[field] + fieldSeparator ;
      
      // todo : dyn generated or manager and dao hierarchy (searchmanager(searchtype))?
      if (searchType == "basic")
	      BasicSearchManager.getAllUpdatedValues(updateForm, selectedValuesStr, nameValueSeparator, fieldSeparator);
	  else if (searchType == "advanced")
	      AdvancedSearchManager.getAllUpdatedValues(updateForm, selectedValuesStr, nameValueSeparator, fieldSeparator);
	  else if (searchType == "specimen")
	      SpecimenSearchManager.getAllUpdatedValues(updateForm, selectedValuesStr, nameValueSeparator, fieldSeparator);
  }

  function updateForm(data)
  {
  	var j = 0 ;
	for(i=0; i<fields.length; i++) {
		if (DWRUtil.isHTMLSelectElement(DWRUtil.getElementById(fieldPrefix + fields[i]))) {
		  	updateList(fields[i], data[j]);
			j = j + 1 ;
		}
	}
  }
  
  function updateList(id, data)
  {
  	  var bsId = fieldPrefix + id ;
	  var list = DWRUtil.getElementById(bsId);
	  
	  list.options.length = 0 ;
	  fillListWithCachedOptionValues(bsId, data);	  
	  
	  if (data.length==1)
	  	  selectedValues[id] = list.options[1].value ;
	  DWRUtil.setValue(bsId, selectedValues[id]);	  
	  
  }

function fillListWithCachedOptionValues(id, dataSet)
{

	var fieldName = id.replace(fieldPrefix, '') ;

    var list = DWRUtil.getElementById(id);
    if (list == null)
    {
        alert("fillList() can't find an element with id: " + id + ".");
        throw id;
    }

    if (!DWRUtil.isHTMLSelectElement(list))
    {
        alert("fillList() can only be used with select elements. Attempt to use: " + DWRUtil.detailedTypeOf(list));
        throw list;
    }

    if (dataSet == null)
    {	
        return;
    }

	list.options[0] = new Option(optionsCache[fieldName][0].text, optionsCache[fieldName][0].value) ;

	var count = 0 ;
	for (var j = 0; j < optionsCache[fieldName].length; j++) {
	    for (var i = 0; i < dataSet.length; i++) {
          	if (optionsCache[fieldName][j].value == dataSet[i]) {
          		count++ ;
          		list.options[count] = new Option(optionsCache[fieldName][j].text, optionsCache[fieldName][j].value) ;
				break ;
          	}
		}
    }

}

  function beginWait() {
   	document.body.style.cursor = "wait" ;
  	var waitMessage = "Loading ..." ;
  	document.getElementById("waitingMessage").innerHTML = waitMessage ;
  }

  function endWait() {
   	document.body.style.cursor = "default" ;
  	document.getElementById("waitingMessage").innerHTML = '&nbsp;' ;
  }
