﻿var CitiesList = (function(){
  var Cities = (function(){
    var data = {};
    var busy = false;
    var url = "explorer/CitiesNIndexes";
    
    var imported = function(resData, textStatus){
      data[resData.uid] = {"html":resData.html, "indexes":resData.indexes};
      busy = false;
    };
    
    var impData = function(districtUid){
      busy = true;
      $.post ( url+"~"+districtUid, {}, imported, "json");
    };

    var __construct = {
      getData:function(districtUid){
        if (data[districtUid]===undefined) {
          if (busy) return false;
          impData(districtUid);
          return false;
        }
        return data[districtUid];
      }
    };
    return __construct;
  })();
    
  var __construct = function(dis, cit, zip){
    var districtOb = $(dis);
    var cityOb = $(cit);
    var zipOb = $(zip);
    
    var autoFillByZip = function(){
      var changeCombos = function(resData, textStatus){
  
        districtOb.val(resData.district);
        districtOb.change();
        wait("setCity",resData.city);
      };
    
      /*if(parseInt(zipOb.val())<10000) return false;*/
      $.post ( "explorer/autoFillByZip"+"~"+zipOb.val(), {}, changeCombos, "json");
    };
    
    var wait = function(fn, arg){
      var retry = function(){
        wait(fn, arg);
      };
      var res = Cities.getData(districtOb.val());

      if (res===false) setTimeout(retry, 60);
      else {
        switch (fn){
          case "changeDistrict":{
            cityOb.html(res.html);
          }break;
          case "checkIndex":{
            /*alert(districtOb.val()+"="+cityOb.val());*/
          }break;
          case "setCity":{
            cityOb.val(arguments[1]);
          }break;
        }
      }
    };

    districtOb.change(function(){
      cityOb.html("<option value='0'>идет загрузка...</option>")
      wait("changeDistrict");
    });
    
    cityOb.change(function(){
      wait("checkIndex");
    });
    
    zipOb.blur(function(){
      autoFillByZip();
    });
  };
  
  return __construct;
})();

var a23567=new CitiesList('[name="district"]','[name="city"]','[name="zip"]');


