if(typeof(Tutoria) == "undefined")
  Tutoria = {};

Tutoria.multiSelect = function(parentSelectId, childSelectId, map, onChangeCallback) {
  function clearSelect(select) {
    while(select.options.length > 0)
      select.options[0] = null;
  }

  function onChange(event) {
    if(onChangeCallback && (event != null || window.event != null)) {
      if(typeof(onChangeCallback) == "string")
	eval(onChangeCallback);
      else
	onChangeCallback(event);
    }
  }

  var parentSelect = document.getElementById(parentSelectId);
  var childSelect  = document.getElementById(childSelectId);

  var i = 0;
  map.each(function(mapping) {
    var category = mapping[0];
    var option = category.split("|");
    parentSelect.options[i] = new Option(option[1], option[0]);
    i++;
  });

  parentSelect.onchange = function(event) {
    var selection = parentSelect.options[parentSelect.selectedIndex].innerHTML;
    var key       = parentSelect.value + "|" + selection;

    clearSelect(childSelect);
    var i = 0;
    var items = map.detect(function(mapping) { return mapping[0] == key; })[1];
    items.each(function(id_name_pair) {
      childSelect.options[i] = new Option(id_name_pair[1], id_name_pair[0]);
      i++;
    });

    onChange(event);
  };

  if(onChangeCallback)
    childSelect.onchange = onChange;

  parentSelect.onchange();
};
