public virtual void addEkipa(Ekipa e, RezultatskoTakmicenje rezTak, RezultatskoTakmicenje rezTak1,
                                     RezultatskoTakmicenje rezTak2)
        {
            RezultatEkipnoFinaleKupa rezultat = new RezultatEkipnoFinaleKupa();

            rezultat.Ekipa = e;

            foreach (RezultatEkipno r in rezTak1.Takmicenje1.PoredakEkipno.Rezultati)
            {
                if (r.Ekipa.Equals(e))
                {
                    rezultat.initPrvoKolo(r);
                    break;
                }
            }
            foreach (RezultatEkipno r in rezTak2.Takmicenje1.PoredakEkipno.Rezultati)
            {
                if (r.Ekipa.Equals(e))
                {
                    rezultat.initDrugoKolo(r);
                    break;
                }
            }

            rezultat.calculateTotal(rezTak.Propozicije.NacinRacunanjaOceneFinaleKupaTak4);
            Rezultati.Add(rezultat);
            rankRezultati(rezTak.Propozicije);
        }
        public virtual void deleteEkipa(Ekipa e, RezultatskoTakmicenje rezTak)
        {
            RezultatEkipnoFinaleKupa r = getRezultat(e);

            if (r != null)
            {
                Rezultati.Remove(r);
                rankRezultati(rezTak.Propozicije);
            }
        }
        public virtual void loadFromDump(StringReader reader, IdMap map)
        {
            DeoTakmicenjaKod = (DeoTakmicenjaKod)Enum.Parse(typeof(DeoTakmicenjaKod), reader.ReadLine());

            int brojRezultata = int.Parse(reader.ReadLine());

            for (int i = 0; i < brojRezultata; ++i)
            {
                reader.ReadLine();  // id
                RezultatEkipnoFinaleKupa r = new RezultatEkipnoFinaleKupa();
                r.loadFromDump(reader, map);
                Rezultati.Add(r);
            }
        }
        public virtual void create(RezultatskoTakmicenje rezTak, RezultatskoTakmicenje rezTak1,
                                   RezultatskoTakmicenje rezTak2)
        {
            // NOTE: Da bi Ekipa mogla da se koristi kao key u Dictionary, mora da implementira
            // interfejs IEquatable<Ekipa>.
            IDictionary <Ekipa, RezultatEkipnoFinaleKupa> rezultatiMap =
                new Dictionary <Ekipa, RezultatEkipnoFinaleKupa>();

            foreach (Ekipa e in rezTak.Takmicenje1.Ekipe)
            {
                RezultatEkipnoFinaleKupa rezultat = new RezultatEkipnoFinaleKupa();
                rezultat.Ekipa = e;
                rezultatiMap.Add(e, rezultat);
            }

            foreach (RezultatEkipno r in rezTak1.Takmicenje1.PoredakEkipno.Rezultati)
            {
                if (rezultatiMap.ContainsKey(r.Ekipa))
                {
                    rezultatiMap[r.Ekipa].initPrvoKolo(r);
                }
            }
            foreach (RezultatEkipno r in rezTak2.Takmicenje1.PoredakEkipno.Rezultati)
            {
                if (rezultatiMap.ContainsKey(r.Ekipa))
                {
                    rezultatiMap[r.Ekipa].initDrugoKolo(r);
                }
            }

            Rezultati.Clear();
            foreach (RezultatEkipnoFinaleKupa r in rezultatiMap.Values)
            {
                r.calculateTotal(rezTak.Propozicije.NacinRacunanjaOceneFinaleKupaTak4);
                Rezultati.Add(r);
            }
            rankRezultati(rezTak.Propozicije);
        }
        public virtual void create(RezultatskoTakmicenje rezTak, PoredakEkipno poredakPrvoKolo,
            PoredakEkipno poredakDrugoKolo)
        {
            IList<Ekipa> ekipe = new List<Ekipa>(rezTak.Takmicenje1.Ekipe);

            // NOTE: Da bi Ekipa mogla da se koristi kao key u Dictionary, mora da implementira
            // interfejs IEquatable<Ekipa>.
            IDictionary<Ekipa, RezultatEkipnoFinaleKupa> rezultatiMap =
                new Dictionary<Ekipa, RezultatEkipnoFinaleKupa>();
            foreach (Ekipa e in ekipe)
            {
                RezultatEkipnoFinaleKupa rezultat = new RezultatEkipnoFinaleKupa();
                rezultat.Ekipa = e;
                rezultatiMap.Add(e, rezultat);
            }

            if (poredakPrvoKolo != null)
            {
                foreach (RezultatEkipno r in poredakPrvoKolo.Rezultati)
                {
                    if (rezultatiMap.ContainsKey(r.Ekipa))
                    {
                        rezultatiMap[r.Ekipa].ParterPrvoKolo = r.Parter;
                        rezultatiMap[r.Ekipa].KonjPrvoKolo = r.Konj;
                        rezultatiMap[r.Ekipa].KarikePrvoKolo = r.Karike;
                        rezultatiMap[r.Ekipa].PreskokPrvoKolo = r.Preskok;
                        rezultatiMap[r.Ekipa].RazbojPrvoKolo = r.Razboj;
                        rezultatiMap[r.Ekipa].VratiloPrvoKolo = r.Vratilo;
                        rezultatiMap[r.Ekipa].DvovisinskiRazbojPrvoKolo = r.DvovisinskiRazboj;
                        rezultatiMap[r.Ekipa].GredaPrvoKolo = r.Greda;
                        rezultatiMap[r.Ekipa].TotalPrvoKolo = r.Total;
                    }
                }
            }

            if (poredakDrugoKolo != null)
            {
                foreach (RezultatEkipno r in poredakDrugoKolo.Rezultati)
                {
                    if (rezultatiMap.ContainsKey(r.Ekipa))
                    {
                        rezultatiMap[r.Ekipa].ParterDrugoKolo = r.Parter;
                        rezultatiMap[r.Ekipa].KonjDrugoKolo = r.Konj;
                        rezultatiMap[r.Ekipa].KarikeDrugoKolo = r.Karike;
                        rezultatiMap[r.Ekipa].PreskokDrugoKolo = r.Preskok;
                        rezultatiMap[r.Ekipa].RazbojDrugoKolo = r.Razboj;
                        rezultatiMap[r.Ekipa].VratiloDrugoKolo = r.Vratilo;
                        rezultatiMap[r.Ekipa].DvovisinskiRazbojDrugoKolo = r.DvovisinskiRazboj;
                        rezultatiMap[r.Ekipa].GredaDrugoKolo = r.Greda;
                        rezultatiMap[r.Ekipa].TotalDrugoKolo = r.Total;
                    }
                }
            }

            List<RezultatEkipnoFinaleKupa> rezultati = new List<RezultatEkipnoFinaleKupa>(rezultatiMap.Values);
            Rezultati.Clear();
            foreach (RezultatEkipnoFinaleKupa rez in rezultati)
                Rezultati.Add(rez);

            // Total moze da bude krajnja finalna ocena ili ulazna finalna ocena. U oba slucaja se Total izracunava
            // na isti nacin.
            foreach (RezultatEkipnoFinaleKupa rez in Rezultati)
            {
                if (rez.TotalPrvoKolo == null && rez.TotalDrugoKolo == null)
                {
                    rez.setTotal(null);
                    continue;
                }
                float total1 = rez.TotalPrvoKolo == null ? 0 : rez.TotalPrvoKolo.Value;
                float total2 = rez.TotalDrugoKolo == null ? 0 : rez.TotalDrugoKolo.Value;
                float total;

                if (rezTak.Propozicije.Tak4FinalnaOcenaJeZbirObaKola)
                    total = total1 + total2;
                else if (rezTak.Propozicije.Tak4FinalnaOcenaJeMaxObaKola)
                    total = total1 > total2 ? total1 : total2;
                else
                {
                    // TODO3: Proveri da li ovde treba podesavati broj decimala.
                    total = (total1 + total2) / 2;
                    if (rezTak.Propozicije.Tak4NeRacunajProsekAkoNemaOceneIzObaKola
                        && (rez.TotalPrvoKolo == null || rez.TotalDrugoKolo == null))
                    {
                        total = total1 + total2;
                    }
                }
                rez.setTotal(total);
            }

            rankRezultati();
            if (rezTak.Propozicije.OdvojenoTak4)
                updateKvalStatus(rezTak.Propozicije.BrojEkipaUFinalu, 0);
        }