var cache=[];
var frm;
var dscr;
var dscr_data=[];

function is_array(a) {
  return a && typeof a == 'object' && a.constructor == Array;
}

function add_select(slct,value,text)  {
  var e=document.createElement('option');
  e.text=text; e.value=value;
  try {
    slct.add(e,null);
  } catch(ex) {
    slct.add(e);
  }
}

function fill_select(slct,data) {
  if (data) {
    while(slct.length > 0) {
     slct.remove(slct.length - 1);
    }
    if (is_array(data)) {
      for (i=0;i<data.length;i++) {
        add_select(slct,data[i].value,data[i].text);
        dscr_data[data[i].value]=data[i].descr;
      }
    }
    else {
      add_select(slct,data.value,data.text);
      dscr_data[data.value]=data.descr;
    }
  }
}

function set_descr(slct) {
  if (dscr_data[slct.value]) {
    dscr.innerHTML=dscr_data[slct.value].replace(/\n/g,"<p>");
  }
  else {
    dscr.innerHTML='';
  }
}

function process_request(url) {
  var data;
  try {
    if (!cache[url]) {
      var xml = new JKL.ParseXML(url);
      data = xml.parse();
      cache[url]=data;
    }
    else {
      data = cache[url];
    }
  }
  catch(ex) { alert('Ошибка при обращении к URL '+url); return; }
  if (data.document.event) { // обработка события
    eval(data.document.event);
  }
  for (curfield in data.document.fields) { // обработка select-полей из fields
// проверить, нужно ли поставить в disabled  поле
    if (frm.elements[curfield].type=='select-one') {
      if (data.document.fields[curfield].enabled==0) {
        frm.elements[curfield].disabled=1;
        frm.elements[curfield].onmouseover=new Function('');
      }
      else { frm.elements[curfield].disabled=0;
        frm.elements[curfield].onmouseover=new Function('set_descr(this);');
      }
      fill_select(frm.elements[curfield],data.document.fields[curfield].item);
      if (data.document.fields[curfield].subquery==1) {
        frm.elements[curfield].onchange = new Function('process_request(this.value);');
        process_request(frm.elements[curfield].value);
      }
      else { frm.elements[curfield].onchange = new Function('set_descr(this);'); }
    }
  }
  for (curfield in data.document.subfields) { // обработка вспомогательных полей из subfields
    if (frm.elements[curfield]) {
      frm.elements[curfield].value=data.document.subfields[curfield];
    }
  }
  return true;
}

function init(formname,start_url,descr) {
  frm = document.forms[formname];
  dscr = document.getElementById(descr);
  process_request(start_url);
}

