var SELECTOR = {};

(function() {

function get_treev(model_name, root_value, elem, callback) {

  var url = '/structure/chooser/'+model_name+'/'+root_value+'/children/'

  if (elem.nodeName == 'SELECT') {
    var select = elem
    var img = document.getElementById(select.id+'_progress')
    img.style.display = 'block'
    select.innerHTML = ''
  }
  else {
    var select = document.createElement('select')
    select.id = elem.id
    select.name = elem.name

    select.selectedIndex = 0
    elem.name += '_old'
    elem.id += '_old'
    elem.style.display = 'none'
    elem.parentNode.insertBefore(select, elem)
    
    var img = document.createElement('img')
    img.src = '/statics/img/progress.gif'
    img.style.padding = '8px'
    img.id = select.id+'_progress'
    elem.parentNode.insertBefore(img, elem)
    //elem.parentNode.removeChild(elem)
  }

  var emptyo = document.createElement('option')
  emptyo.value = ''
  emptyo.appendChild(document.createTextNode(' - select - '))
  select.appendChild(emptyo)

  if (url.indexOf('//') != -1) {
    select.disabled = true
    img.style.display = 'none'
    return select
  }

   $.ajax({
  type: "GET",
  url: url,
  async: true,
  dataType: "json",
  success: function(data){fill_options(data,select,callback)},
  error: function(XMLHttpRequest, textStatus, errorThrown){
	  alert('There was a problem with the request.');
      document.write(XMLHttpRequest.responseText);
  }});
  
  return select
}

function fill_options(data, select, callback) {
  for (var i=0; i < data.length; ++i)
  {
	var option = document.createElement('option')
	option.value = data[i].id
	option.appendChild(document.createTextNode(data[i].value))
	select.appendChild(option)
  }
  if (callback)
	callback(select)
  else
	//select.value = document.getElementById(select.id+'_old').value)
  try {
		$(select).val(document.getElementById(select.id+'_old').value)
  } catch(e) {}
  select.disabled = false
  var img = document.getElementById(select.id+'_progress')
  img.style.display = 'none'
}

function make_tree_selector(model_name, elem_id, root_value, parent_elem, all_elems) {
  if (!all_elems) all_elems = []
  var elem = document.getElementById(elem_id)
  var newelem
  if (parent_elem) {
    var parent = document.getElementById(parent_elem)
    var oldparent = document.getElementById(parent_elem+'_old')
    newelem = get_treev(model_name, oldparent.value, elem)
    parent.onchange = function (e) {
        var isChildren = false;
        for (var i=0; i < all_elems.length; ++i) {
            var e_parent = document.getElementById(all_elems[i - 1]) || null;
            var e = document.getElementById(all_elems[i]);
            if (e_parent && !e_parent.value) {
                e.selectedIndex = 0;
                e.disabled = true;
            } else if (isChildren) {
                e.selectedIndex = 0;
            } else if (e.name == this.name) {
                isChildren = true;
            } else if (!e.value) {
                isChildren = true;
            }
        }
        get_treev(model_name, this.value, newelem, function () {
            for (var i=0; i < all_elems.length; ++i) {
                if (all_elems[i] == newelem.id) {
                    break;
                } else {
                    document.getElementById(all_elems[i]).disabled = false;
                }
            }
        });
    }
  }
  else
    newelem = get_treev(model_name, root_value, elem)
}

SELECTOR.makeTreeSelectors = function (model_name, elem_list, root_value) {
  make_tree_selector(model_name, elem_list[0], root_value, null, elem_list)
  for (var i=1; i < elem_list.length; ++i)
    make_tree_selector(model_name, elem_list[i], null, elem_list[i-1], elem_list)
}

// go back to previous state + select ids
SELECTOR.resetSelectors = function (model_name, elem_list, ids) {
  var parent = document.getElementById(elem_list[0])
  parent.value = ids[0]
  var values = {}
  for (var i=1; i < elem_list.length; ++i) {
    values[elem_list[i]] = ids[i]
    get_treev(model_name, ids[i-1], document.getElementById(elem_list[i]),
      function (select) {
        //select.value = values[select.id]
	try {
	  $(select).val(values[select.id])
	} catch(e) {}
      }
    )
  }
}

})();
