
//******************************************************************************

var judete_locatii = new Object ();

//******************************************************************************

function load_judete_localitati_spatii_locatii()
{
  var data_array, key_judet, key_localitate, key_spatiu, key_locatie;
  var i, j;
  var judet, localitate, spatiu, locatie;

  data_array = parse_csv_data(load_file("./data/judete.csv"));
  for (i=0; i<data_array.length; i++)
  {
    data_line = data_array[i];

    if (data_line[0] == null || data_line[0].length < 1)
      throw "load_judete_localitati_spatii_locatii: judete - judet cu numele necompletat";
    key_judet = data_line[0].toLowerCase();
    if (judete_locatii[key_judet] != null)
      throw "load_judete_localitati_spatii_locatii: judete - judet duplicat: " + key_judet;
    if (data_line[1] == null)
      throw "load_judete_localitati_spatii_locatii: judete - cod judet inexistent";

    judet = new Object ();
    judet.nume      = data_line[0];
    judet.cod       = data_line[1];
    judet.populatie = (data_line[2] != null) ? data_line[2] : '';
    judet.populatie = parseInt (judet.populatie);
    judet.densitate = (data_line[3] != null) ? data_line[3] : '';
    judet.densitate = parseInt (judet.densitate);
    judet.localitati = new Object ();
    judete_locatii[key_judet] = judet;
  }

  data_array = parse_csv_data(load_file("./data/localitati.csv"));
  for (i=0; i<data_array.length; i++)
  {
    data_line = data_array[i];

    if (data_line[0] == null || data_line[0].length < 1)
      throw "load_judete_localitati_spatii_locatii: localitati - judet cu numele necompletat";
    key_judet = data_line[0].toLowerCase();
    if (judete_locatii[key_judet] == null)
      throw "load_judete_localitati_spatii_locatii: localitati - judet invalid: " + key_judet;

    if (data_line[1] == null || data_line[1].length < 1)
      throw "load_judete_localitati_spatii_locatii: localitati - localitate cu numele necompletat";
    key_localitate = data_line[1].toLowerCase();
    if (judete_locatii[key_judet][key_localitate] != null)
      throw "load_judete_localitati_spatii_locatii: localitati - localitate duplicata: " + key_localitate;

    if (data_line[2] == null)
      throw "load_judete_localitati_spatii_locatii: localitati - cod localitate inexistent";

    localitate = new Object ();
    localitate.nume       = data_line[1];
    localitate.cod        = data_line[2];
    localitate.populatie  = (data_line[3] != null) ? data_line[3] : '';
    localitate.populatie = parseInt (localitate.populatie);
    localitate.spatii = new Object ();
    judete_locatii[key_judet].localitati[key_localitate] = localitate;
  }

  data_array = parse_csv_data(load_file("./data/spatii.csv"));
  for (i=0; i<data_array.length; i++)
  {
    data_line = data_array[i];

    if (data_line[0] == null || data_line[0].length < 1)
      throw "load_judete_localitati_spatii_locatii: spatii - judet cu numele necompletat";
    key_judet = data_line[0].toLowerCase();
    if (judete_locatii[key_judet] == null)
      throw "load_judete_localitati_spatii_locatii: spatii - judet invalid: " + key_judet;

    if (data_line[1] == null || data_line[1].length < 1)
      throw "load_judete_localitati_spatii_locatii: spatii - localitate cu numele necompletat";
    key_localitate = data_line[1].toLowerCase();
    if (judete_locatii[key_judet].localitati[key_localitate] == null)
      throw "load_judete_localitati_spatii_locatii: spatii - localitate invalida: " + key_localitate;

    if (data_line[2] == null || data_line[2].length < 1)
      throw "load_judete_localitati_spatii_locatii: spatii - cod spatiu necompletat";
    key_spatiu = data_line[2].toUpperCase();
    if (judete_locatii[key_judet].localitati[key_localitate].spatii[key_spatiu] != null)
      throw "load_judete_localitati_spatii_locatii: spatii - cod spatiu duplicat: " + key_spatiu;
    
    spatiu = new Object ();
    spatiu.nume   = (data_line[3] != null) ? data_line[3] : '';
    spatiu.adresa = (data_line[4] != null) ? data_line[4] : '';
    spatiu.locatii = new Object ();
    judete_locatii[key_judet].localitati[key_localitate].spatii[key_spatiu] = spatiu;
  }

  data_array = parse_csv_data(load_file("./data/locatii.csv"));
  for (i=0; i<data_array.length; i++)
  {
    data_line = data_array[i];

    if (data_line[0] == null || data_line[0].length < 1)
      throw "load_judete_localitati_spatii_locatii: locatii - judet cu numele necompletat";
    key_judet = data_line[0].toLowerCase();
    if (judete_locatii[key_judet] == null)
      throw "load_judete_localitati_spatii_locatii: locatii - judet invalid: " + key_judet;

    if (data_line[1] == null || data_line[1].length < 1)
      throw "load_judete_localitati_spatii_locatii: locatii - localitate cu numele necompletat";
    key_localitate = data_line[1].toLowerCase();
    if (judete_locatii[key_judet].localitati[key_localitate] == null)
      throw "load_judete_localitati_spatii_locatii: locatii - localitate invalida: " + key_localitate;

    if (data_line[2] == null || data_line[2].length < 1)
      throw "load_judete_localitati_spatii_locatii: locatii - cod spatiu necompletat";
    key_spatiu = data_line[2].toUpperCase();
    if (judete_locatii[key_judet].localitati[key_localitate].spatii[key_spatiu] == null)
      throw "load_judete_localitati_spatii_locatii: locatii - cod spatiu invalid: " + key_spatiu;

    if (data_line[3] == null || data_line[3].length < 1)
      throw "load_judete_localitati_spatii_locatii: locatii - cod locatie necompletat";
    key_locatie = data_line[3].toLowerCase();
    if (judete_locatii[key_judet].localitati[key_localitate].spatii[key_spatiu].locatii[key_locatie] != null)
      throw "load_judete_localitati_spatii_locatii: locatii - cod locatie duplicat: " + key_spatiu + "." + key_locatie;

    locatie = new Object ();
    locatie.tip         = (data_line[4] != null) ? data_line[4] : '';
    locatie.suprafata   = (data_line[5] != null) ? data_line[5] : '';
    locatie.suprafata = parseInt (locatie.suprafata);
    locatie.disponibil  = (data_line[6] != null) ? data_line[6] : '';
    locatie.facilitati  = (data_line[7] != null) ? data_line[7] : '';
    judete_locatii[key_judet].localitati[key_localitate].spatii[key_spatiu].locatii[key_locatie] = locatie;
  }
  
  build_judete_locatii_cache();
}

//******************************************************************************

function build_judete_locatii_cache()
{
  var i, j, k;
  var judet, localitate, spatiu, locatie;
  var nr_localitati_judet, nr_spatii_judet, nr_locatii_judet, suprafata_totala_judet, lista_localitati_judet,
      nr_spatii_localitate, nr_locatii_localitate, suprafata_totala_localitate,
      nr_locatii_spatiu, suprafata_totala_spatiu;
  
  for (i in judete_locatii)
    if (i != 'clone')
    {
      judet = judete_locatii[i];
      nr_localitati_judet = nr_spatii_judet = nr_locatii_judet = suprafata_totala_judet = 0;
      lista_localitati_judet = new Array ();

      for (j in judet.localitati)
        if (j != 'clone')
        {
          localitate = judet.localitati[j];
          nr_spatii_localitate = nr_locatii_localitate = suprafata_totala_localitate = 0;

          for (k in localitate.spatii)
            if (k != 'clone')
            {
              spatiu = localitate.spatii[k];
              nr_locatii_spatiu = suprafata_totala_spatiu = 0;

              for (l in spatiu.locatii)
                if (l != 'clone')
                {
                  locatie = spatiu.locatii[l];
                  nr_locatii_spatiu += 1;
                  suprafata_totala_spatiu += locatie.suprafata;
                }

              spatiu.cache = new Object ();
              spatiu.cache.nr_locatii = nr_locatii_spatiu;
              spatiu.cache.suprafata = suprafata_totala_spatiu;
              localitate.spatii[k] = spatiu;

              nr_spatii_localitate += 1;
              nr_locatii_localitate += nr_locatii_spatiu;
              suprafata_totala_localitate += suprafata_totala_spatiu;
            }

          localitate.cache = new Object ();
          localitate.cache.nr_spatii = nr_spatii_localitate;
          localitate.cache.nr_locatii = nr_locatii_localitate;
          localitate.cache.suprafata = suprafata_totala_localitate;
          judet.localitati[j] = localitate;

          nr_localitati_judet += 1;
          nr_spatii_judet += nr_spatii_localitate;
          nr_locatii_judet += nr_locatii_localitate;
          suprafata_totala_judet += suprafata_totala_localitate;
          lista_localitati_judet.push(localitate.nume);
        }

      judet.cache = new Object ();
      judet.cache.nr_localitati = nr_localitati_judet;
      judet.cache.nr_spatii = nr_spatii_judet;
      judet.cache.nr_locatii = nr_locatii_judet;
      judet.cache.suprafata = suprafata_totala_judet;
      judet.cache.lista_localitati = lista_localitati_judet;
      judete_locatii[i] = judet;
    }
}

//******************************************************************************

function getIndexSocietate(Societati, numeSocietate) {
  for(var i=0; i<Societati.length; i++) {
    if(Societati[i].Nume == numeSocietate)
      return i;
  }
  
  return -1;
}

//******************************************************************************

function getJudet(InfoContact, numeJudet)
{
  for(var i=0; i<InfoContact.length; i++) {
    if(InfoContact[i].Nume.toLowerCase() == numeJudet.toLowerCase())
      return InfoContact[i];
  }
  
  return null;
}

//******************************************************************************

function loadInfoContact (filename)
{
    var data_array = parse_csv_data(load_file(filename));
    
    var InfoContact = new Array ();  //vector cu informatii de contact pentru judete
    
    for(var i=0; i<data_array.length; i++) {
      //ordine date:  
      //Judet, Nume, Prenume, Functie, Email, Tel, Mobil, Fax
      //Companie, Localitate, Judet, Strada, Numar, Bloc, Apartament
    
      var PersoanaContact       = new Object;     //informatii de contact pentru o singura persoana
      
      PersoanaContact.Nume    = data_array[i][1];
      PersoanaContact.Prenume = data_array[i][2];
      PersoanaContact.Functie = data_array[i][3];
      PersoanaContact.Email   = data_array[i][4];
      PersoanaContact.Telefon = data_array[i][5];
      PersoanaContact.Celular = data_array[i][6];
      PersoanaContact.Fax     = data_array[i][7];
      PersoanaContact.Adresa  = new Object();      

      PersoanaContact.Adresa.Localitate = data_array[i][9];
      PersoanaContact.Adresa.Judet      = data_array[i][10];
      PersoanaContact.Adresa.Strada     = data_array[i][11];
      PersoanaContact.Adresa.NrStrada   = data_array[i][12];
      PersoanaContact.Adresa.Bloc       = data_array[i][13];
      PersoanaContact.Adresa.Apartament = data_array[i][14];

      var Societate;
      
      var NumeJudet = data_array[i][0];

      var Judet = getJudet(InfoContact, NumeJudet);
      if(Judet == null) {
        Judet = new Object();
        Judet.Nume = NumeJudet;
        InfoContact.push (Judet);
      }
     
      var Societati = Judet.Societati;
      if(Societati == null) {
        Societati = new Array ();   //vector cu informatii de contact pentru societatile din judet 
      }

      var numeSocietate = data_array[i][8];
      var socIndex = getIndexSocietate(Societati, numeSocietate);
      if(socIndex < 0) { //societatea nu e inca in array
        Societate = new Object ();
        
        //Completare structura noua societate
        Societate.Nume = numeSocietate;
      
        var ListaPersoaneContact = new Array ();   //vector cu informatii de contact pentru persoanele dintr-o societate
        ListaPersoaneContact.push(PersoanaContact);
        Societate.PersoaneContact = ListaPersoaneContact;

        //Adaugare noua societate la lista societatilor din judet
        Societati.push (Societate);
      }
      else { //mai exista date despre societate
        //Adaugare persoana la lista persoanelor de contact pentru o societate            
        Societati[socIndex].PersoaneContact.push(PersoanaContact);
      }

      //Adaugare nou judet (cu persoanele de contact pentru fiecare societate din judet) la lista de judete
      Judet.Societati = Societati;
      
    }
    
    return InfoContact;
}

//******************************************************************************

