/* remember do include districts_data.js */

var dSelectionContexts = new Array();

function districts_newContext(ctxtName,vControlId,dControlId,svControlId,sdControlId,multiple) {

  var ctxt = dSelectionContexts[ctxtName];
  if (ctxt) {
    alert('Duplicate context: '+ctxtName);
    return;
  }

  var i;
  var arr = new Object;
  arr["multiple"] = multiple;
  arr["voivodships"] = document.getElementById(vControlId);
  arr["districts"] = document.getElementById(dControlId);
  if (multiple) {
    arr["svoivodships"] = document.getElementById(svControlId);
    arr["sdistricts"] = document.getElementById(sdControlId);
    arr["sel_voivodships"] = new Array();
    for (i = 0; i < t_voivodships.length; i++) {
      arr["sel_voivodships"][i] = 0;
    }
    arr["sel_districts"] = new Array();
    for (i = 0; i < t_districts.length; i++) {
      arr["sel_districts"][i] = false;
    }
  }
  dSelectionContexts[ctxtName] = arr;

  if (!arr["voivodships"]) {
    alert('No element with id ['+dControlId+']');
    return;
  }

  if (!arr["districts"]) {
    alert('No element with id ['+vControlId+']');
    return;
  }

  districts_insertVoivodships(document.getElementById(vControlId),multiple);
}

function districts_delContext(ctxtName) {
  var ctxt = dSelectionContexts[ctxtName];
  if (ctxt) {
    dSelectionContexts[ctxtName] = false;
  }
}

function districts_getContext(ctxtName) {
  var ctxt = dSelectionContexts[ctxtName];
  if (!ctxt) {
    alert('No such context: '+ctxtName);
    return null;
  }
  return ctxt;
}

function districts_insertVoivodships(dVoivodship, multiple) {
  var i;

  dVoivodship.options.length = 0;

  for (i = 1; i < t_voivodships.length; i++) {
    dVoivodship.options[dVoivodship.options.length] = new Option(
        t_voivodships[i],i,false,false);
  }

  if (!multiple) {
    dVoivodship.options[dVoivodship.options.length] = new Option("","",false,true);
    dVoivodship.options[dVoivodship.options.length-1].selected = true;
  }
}

function districts_outputSelectedVoivodships(ctxt) {
  var svSelect = ctxt["svoivodships"];
  if (svSelect) {
    if (ctxt["multiple"]) {
      svSelect.options.length = 0;
      var i;
      for (i = 1; i < t_voivodships.length; i++) {
        if (ctxt["sel_voivodships"][i] > 0) {
          svSelect.options[svSelect.options.length] = new Option(t_voivodships[i],i,false,false);
        }
      }
      selval(svSelect,sval(ctxt["voivodships"]));
    }
  }
}

function districts_outputSelectedDistricts(ctxt) {
  var sdSelect = ctxt["sdistricts"];
  if (sdSelect) {
    if (ctxt["multiple"]) {
      var prevVal = sval(sdSelect);
      sdSelect.options.length = 0;
      var i;
      for (i = 1; i < t_districts.length; i++) {
        if (ctxt["sel_districts"][i] > 0) {
          sdSelect.options[sdSelect.options.length] = new Option(t_districts[i],i,false,false);
        }
      }
      if (prevVal) selval(sdSelect,prevVal);
    }
  }
}

function districts_updateDistrictSelection(ctxt) {
  var multiple = ctxt["multiple"];
  if (multiple) {
    var dSelect = ctxt["districts"];
    var dVoivodship = ctxt["voivodships"];
    var sDistricts = ctxt["sel_districts"];
    var sVoivodships = ctxt["sel_voivodships"];

    var d;

    var voiv = 0;
    var cnt = 0;

    for (i = 0; i < dSelect.options.length; i++) {
      d = dSelect.options[i].value;
      if (!voiv) {
        voiv = t_district_voivodship[d];
      }
      if (dSelect.options[i].selected) {
        if (multiple) {
          if (!sDistricts[d]) {
            /* checked */
            sDistricts[d] = true;
          }
          cnt++;
        }
        else {
          ctxt["sel_district"] = d;
        }
      }
      else {
        if (multiple) {
          if (sDistricts[d]) {
            /* unchecked */
            sDistricts[d] = false;
          }
        }
      }
    }

    if (voiv > 0) {
      ctxt["sel_voivodships"][voiv] = cnt;
    }
  }
}

function districts_showDistrictsForCurrentVoivodship(dVoivodship,dDistrict,sDistricts,ctxt) {
  var v_id = dVoivodship.selectedIndex;
  var d,opt,i,arr;
  dDistrict.options.length = 0;

  v_id++;

  if (v_id > 0) {
    for (i = 0; i < t_voivodship_districts[v_id].length; i++) {
      d = t_voivodship_districts[v_id][i];
      var n = "";
      if (d) {
        n = t_districts[d];
      }
      opt = new Option(n,d,false,false);
      if (ctxt["multiple"]) {
        opt.selected = sDistricts[d];
      }
      else {
        opt.selected = false;
      }
      dDistrict.options[dDistrict.options.length] = opt;
    }
  }
}

function districts_updateVoivodshipSelection(ctxt,doubleClick) {
  var dVoivodships = ctxt["voivodships"];
  var dDistricts = ctxt["districts"];
  var sDistricts = ctxt["sel_districts"];
  var sVoivodships = ctxt["sel_voivodships"];
  var d,i;


  districts_showDistrictsForCurrentVoivodship(dVoivodships,dDistricts,sDistricts,ctxt);
  districts_outputSelectedVoivodships(ctxt);
  districts_outputSelectedDistricts(ctxt);

}

function districts_districtSelectionChanged(ctxtName) {
  var ctxt = districts_getContext(ctxtName);
  if (!ctxt) return;
  if (!ctxt["multiple"]) return;

  /* can trigger some serious rebuild */
  districts_updateDistrictSelection(ctxt);
  districts_outputSelectedVoivodships(ctxt);
  districts_outputSelectedDistricts(ctxt);

}

function districts_voivodshipSelectionChanged(ctxtName) {
  var ctxt = districts_getContext(ctxtName);
  if (!ctxt) return;

  /* can trigger some serious rebuild */
  districts_updateVoivodshipSelection(ctxt,false);
}

function districts_svoivodshipSelectionChanged(ctxtName) {
  var ctxt = districts_getContext(ctxtName);
  if (!ctxt) return;
  var i;
  var idx = ctxt["svoivodships"].selectedIndex;

  var val = sval(ctxt["svoivodships"]);
  if (val) {
    selval(ctxt["voivodships"],val);
    districts_voivodshipSelectionChanged(ctxtName);
  }
}

function districts_sdistrictSelectionChanged(ctxtName) {
  var ctxt = districts_getContext(ctxtName);
  if (!ctxt) return;
  var val = sval(ctxt["sdistricts"]);
  if (val) {
    var valV = t_district_voivodship[val];
    if (valV) {
      selval(ctxt["voivodships"],valV);
    }
    districts_voivodshipSelectionChanged(ctxtName);
  }
}


function districts_getVoivodshipIds(ctxtName) {
  var ctxt = districts_getContext(ctxtName);
  if (!ctxt) return '';

  if (ctxt["multiple"]) {
    var i;
    var ids = new Array();
    for (i = 1; i < t_voivodships.length; i++) {
      if (ctxt["sel_voivodships"][i] > 0) {
        ids[ids.length] = ''+i;
      }
    }
    return multival_join(ids);/*
    if (!v) {
      idlist = new Array();
      sel = ctxt["voivodships"];
      for (i = 0; i < sel.options.length; i++) {
        if (sel.options[i].selected) idlist[idlist.length] = sel.options[i].value;
      }
      return multival_join(idlist);
    }*/
  }
}

function districts_getDistrictIds(ctxtName) {
  var ctxt = districts_getContext(ctxtName);
  if (!ctxt) return '';

  if (ctxt["multiple"]) {
    var i;
    var ids = new Array();
    for (i = 1; i < t_districts.length; i++) {
      if (ctxt["sel_districts"][i]) {
        ids[ids.length] = ''+i;
      }
    }
    return multival_join(ids);
  }
}

function districts_setDistrictIds(ctxtName,list) {
  var ctxt = districts_getContext(ctxtName);
  if (!ctxt) return;
  var multiple = ctxt["multiple"];

  if (multiple) {

    var v_id = 0;
    var i;
    var idarr = multival_split(list);
    var v,cnt,voiv;

    if (idarr && idarr.length > 0 && idarr[0]) {
      for (i = 0; i < idarr.length; i++) {
        v = idarr[i];
        v++; v--;

        if (v <= 0) {
          alert('Bad id value: ['+v+']');
          continue;
        }

        ctxt["sel_districts"][v] = true;

        voiv = t_district_voivodship[v];

        cnt = ctxt["sel_voivodships"][voiv];
        cnt++;
        ctxt["sel_voivodships"][voiv]++;

        if (v_id == 0) {
          v_id = voiv;
          ctxt["voivodships"].selectedIndex = v_id-1;
        }
      }
    }

    districts_updateVoivodshipSelection(ctxt,false);
    districts_outputSelectedVoivodships(ctxt);
    districts_outputSelectedDistricts(ctxt);
  }
  else {
        districts_insertVoivodships(ctxt["voivodships"],false);
        var selD = list;
        var selV = t_district_voivodship[selD];
        if (selV) {
          selval(ctxt["voivodships"],selV);
        }
        districts_showDistrictsForCurrentVoivodship(
            ctxt["voivodships"],
            ctxt["districts"],
            "",
            ctxt);
        selval(ctxt["districts"],selD);
      }
}

function districts_search_mark_districts(voivodship_select,district_select) {
  var sel_voivodships = new Object;
  var sel_districts = new Object;
  var d_id_list = vallist(district_select);
  for (i = 0; i < d_id_list.length; i++) {
    var v = t_district_voivodship[d_id_list[i]];
    if (v) {
      sel_voivodships['v:'+v] = true;
      sel_districts['d:'+d_id_list[i]] = true;
    }
  }
  // zero district select
  district_select.options.length = 0;

  district_select.options[0] = new Option (  'Wszystkie', 'wszystkie', false, false );

  for (i = 0; i < voivodship_select.options.length; i++) {
    var v_id = voivodship_select.options[i].value;
    voivodship_select.options[i].selected = (
        voivodship_select.options[i].selected ||
        (sel_voivodships['v:'+v_id]));

    if (voivodship_select.options[i].selected) {
      if (t_voivodship_districts[v_id]) {
        for (j = 1; j < t_voivodship_districts[v_id].length; j++) {
          var sel = false;
          if (sel_districts['d:'+t_voivodship_districts[v_id][j]]) {
            sel = true;
          }
          district_select.options[district_select.options.length] =
                new Option (
                  t_districts[t_voivodship_districts[v_id][j]],
                  t_voivodship_districts[v_id][j],
                  false,
                  sel );
        }
      }
    }
  }
}

function districts_get_voivodship_districts(voivodship_select,district_select) {
  var sel_districts = new Object;
  var d_id_list = svallist(district_select);
  for (i = 0; i < d_id_list.length; i++) {
    sel_districts['d:'+d_id_list[i]] = true;
  }
  district_select.options.length = 0;

  district_select.options[0] = new Option ( 'Wszystkie', 'wszystkie', false, false );

  var v_id_list = svallist(voivodship_select);
  for (i = 0; i < v_id_list.length; i++) {
    v_id = v_id_list[i];
    if (t_voivodship_districts[v_id]) {
      for (j = 1; j < t_voivodship_districts[v_id].length; j++) {
        var sel = false;
        if (sel_districts['d:'+t_voivodship_districts[v_id][j]]) {
          sel = true;
        }
        district_select.options[district_select.options.length] =
            new Option (
              t_districts[t_voivodship_districts[v_id][j]],
              t_voivodship_districts[v_id][j],
              false,
              sel
            );
      }
    }
  }
}


function districts_get_voivodship_districts2(voivodship_select,district_select) {
  var sel_districts = new Object;
  var d_id_list = svallist(district_select);
  for (i = 0; i < d_id_list.length; i++) {
    sel_districts['d:'+d_id_list[i]] = true;
  }
  district_select.options.length = 0;

  var v_id_list = svallist(voivodship_select);

  district_select.options[district_select.options.length] =
      new Option (
      "",
      "",
      false,
      true );

  for (i = 0; i < v_id_list.length; i++) {
    v_id = v_id_list[i];
    if (t_voivodship_districts[v_id]) {
      for (j = 1; j < t_voivodship_districts[v_id].length; j++) {
        var sel = false;
        if (sel_districts['d:'+t_voivodship_districts[v_id][j]]) {
          sel = true;
        }
        district_select.options[district_select.options.length] =
            new Option (
            t_districts[t_voivodship_districts[v_id][j]],
            t_voivodship_districts[v_id][j],
            false,
            sel);
      }
    }
  }
}


function select_all_control ( init, control ) {
  if ( control ) {
    for( i=0; i<control.options.length; i++ ) {
      control.options[i].selected=true;
    }
  }

  if ( init ) {
    for( i=0; i<init.options.length; i++ ) {
      init.options[i].selected=false;
    }
  }
}

/* new districts - three component control */

function distrctrl_new_context() {

  ctxt = new Object;

  // for efficiency, selected districts lists are stored
  // in a two-level tree structure

  return ctxt;
}

function distrctrl_get_voiv_distr_sel( ctxt, control, voivodship ) {
  control.options.length = 0;

  voivodship++;
  voivodship--;

  if (!voivodship) return;

  seldistrs = ctxt['v:'+voivodship];
  if (!seldistrs) seldistrs = new Object;

  for (i = 1; i < t_voivodship_districts[voivodship].length; i++) {

    s = (seldistrs['d:'+t_voivodship_districts[voivodship][i]] == 'T');

    control.options[control.options.length] = new Option(
        t_districts[t_voivodship_districts[voivodship][i]],
        t_voivodship_districts[voivodship][i],
        false,
        s);
  }
}

function distrctrl_distr_update( ctxt, control, voivodship ) {

  voivodship++;
  voivodship--;

  if (!voivodship) return;

  sels = new Object;

  for (i = 0; i < control.options.length; i++) {
    if (control.options[i].selected) {
      sels['d:'+control.options[i].value] = 'T';
    }
  }

  ctxt['v:'+voivodship] = sels;
}

function distrctrl_add_voivodships( ctxt, voivodship_list, control ) {

  sel = new Object;
  newList = new Array;

  sv = sval(control);

  for (i = 0; i < control.options.length; i++) {
    sel['v:'+control.options[i].value] = 'T';
    newList[newList.length] = control.options[i].value;
  }

  for (i = 0; i < voivodship_list.options.length; i++) {
    if (voivodship_list.options[i].selected) {
      if (sel['v:'+voivodship_list.options[i].value] == 'T') continue;
      newList[newList.length] = voivodship_list.options[i].value;
    }
  }

  sort_array_num(newList);

  control.options.length = 0;
  for (i = 0; i < newList.length; i++) {
    control.options[control.options.length] = new Option(
        t_voivodships[newList[i]],
        newList[i],
        false,
        false);
  }

  selval( control, sv );
}

function distrctrl_sub_voivodships( ctxt, control ) {

  for (i = control.options.length-1; i >= 0; i--) {
    if (control.options[i].selected) {
      ctxt['v:'+control.options[i].value] = false;
      control.options[i] = null;
    }
  }

}

function distrctrl_get_sel_distrs( ctxt ) {

  arr = new Array();

  for (v in ctxt) {
    for (d in ctxt[v]) {
      if (d.substr(0,2) == 'd:') {
        arr[arr.length] = d.substr(2);
      }
    }
  }

  sort_array_num( arr );

  return arr.join(';');
}

function distrctrl_get_sel_voivs( ctxt, control ) {

  arr = vallist( control );

  sort_array_num( arr );

  return arr.join(';');
}

function distrctrl_initialize( ctxt, voivodships, districts, voivodship_control, district_control, voivodships_list_control ) {

  voivodship_control.options.length = 0;
  district_control.options.length = 0;
  voivodships_list_control.options.length = 0;

  for (i = 1; i < t_voivodships.length; i++) {
    voivodships_list_control.options[voivodships_list_control.options.length] = new Option(
        t_voivodships[i],i,false,false);
  }

  neV = false;

  if (voivodships.length > 0) {
    v_arr = voivodships.split(';');
  }
  else {
    v_arr = new Array();
  }

  if (districts.length > 0) {
    v_distr = districts.split(';');
  }
  else {
    v_distr = new Array();
  }

  var vSel = new Object;
  for (i = 0; i < v_arr.length; i++) {
    vSel['v:'+v_arr[i]] = 'T';
  }

  // get additional voivodships from districts
  // and initialize districts at the same time

  for (i = 0; i < v_distr.length; i++) {

    v_distr[i]++;
    v_distr[i]--;

    if (!v_distr[i]) continue; // wrong value - ignore

    // get district voivodship
    vD = t_district_voivodship[v_distr[i]];

    // wrong value
    if (!vD) {
      continue;
    }

    if (!neV) neV = vD;

    // append to voivodship list
    if (vSel['v:'+vD] != 'T') v_arr[v_arr.length] = vD;
    vSel['v:'+vD] = 'T';

    // append district
    vObj = ctxt['v:'+vD];
    if (!vObj) vObj = new Object;
    vObj['d:'+v_distr[i]] = 'T';
    ctxt['v:'+vD] = vObj;
  }

  // districts initialized, now voivodships
  sort_array_num( v_arr );

  for (i = 0; i < v_arr.length; i++) {
    voivodship_control.options[voivodship_control.options.length] = new Option(
        t_voivodships[v_arr[i]],
        v_arr[i],
        false,
        false);
  }

  if ((!neV) && (v_arr.length > 0)) {
    selval(voivodship_control, v_arr[0]);
  }
  else {
    selval(voivodship_control, neV);
  }

  distrctrl_get_voiv_distr_sel( ctxt, district_control, sval(voivodship_control));
}


function ZipUpdateData( zip, street_control_id, city_control_id, district_control_id, voivodship_control_id, districts_context )
{
  var z;

  if ( !zip ) {
    return false;
  }

  try {
    z = ZipData[zip];
  }
  catch( err ) {
    return false;
    z = new Array('Street','City','338','12');
  }

  if ( street_control_id.length ) {
    document.getElementById(street_control_id).value = z[0];
  }
  if ( city_control_id.length ) {
    document.getElementById(city_control_id).value = z[1];
  }
  if ( voivodship_control_id.length ) {
    selval( document.getElementById(voivodship_control_id), z[3] );
  }
  if ( districts_context.length ) {
    districts_voivodshipSelectionChanged(districts_context);
  }
  if ( district_control_id.length ) {
    selval( document.getElementById(district_control_id), z[2] );
  }
}
