using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Baza_Reklam.Classes.Helpers;
using Baza_Reklam.Classes.Model;
using Baza_Reklam.Classes.Repositories;

namespace Baza_Reklam
{
    public partial class OrderDetails : Form
    {
        private static OrderDetails orderDetails;

        private readonly List<Title> _titles = new List<Title>();
        //numery reklam dla nowych zamówień       
        readonly StringDictionary numeryReklam = new StringDictionary();

        SLOWNIKDataSet.Kursy_WalutRow kurs;

        //zmienna wyłączająca obsługę zdarzeń, gdy formularz jest ukryty
        private bool obslugaZdarzen;
        //zmienna ustawiana na TRUE przy wznawianiu lub dodawnaniu nowego zamówienia
        private bool nowyRekord;
        private bool bylyZmiany;

        private ErrorProvider errProvider;

        // przechowuje id aktualnie wyświetlanej reklamy
        private int reklamaId;

        // przechowuje id klienta , którego dotyczy aktualnie wyświetlana reklama
        private int customerId;

        REKLAMADataSetTableAdapters.zmianyEmisjiTableAdapter
           zmianyEmisjiTableAdapter = new REKLAMADataSetTableAdapters.zmianyEmisjiTableAdapter();


        private Title SelectedTitle
        {
            get
            {
                if (tYTULComboBox.SelectedItem == null) return null;
                return (Title)tYTULComboBox.SelectedItem;
            }
        }

        private Section SelectedSection
        {
            get
            {
                if (grzbietComboBox.SelectedItem == null) return null;
                return (Section)grzbietComboBox.SelectedItem;
            }
        }

        private Module SelectedModule
        {
            get
            {
                if (mOD_TYPComboBox.SelectedItem == null) return null;
                return (Module)mOD_TYPComboBox.SelectedItem;
            }
        }

        private NavigationColumn SelectedNavigationColumn
        {
            get
            {
                if (ogl_dzialComboBox.SelectedItem == null) return null;
                return (NavigationColumn)ogl_dzialComboBox.SelectedItem;
            }
        }

        private NavigationSubColumn SelectedNavigationSubColumn
        {
            get
            {
                if (ogl_rozdzialComboBox.SelectedItem == null) return null;
                return (NavigationSubColumn)ogl_rozdzialComboBox.SelectedItem;
            }
        }

        private AdLocation SelectedAdLocation
        {
            get
            {
                if (cbLocation.SelectedItem == null) return null;
                return (AdLocation)cbLocation.SelectedItem;
            }
        }

        protected REKLAMADataSet.REKLAMARow Reklama
        {
            get
            {
                if (rEKLAMABindingSource.Current == null) return null;
                return (REKLAMADataSet.REKLAMARow)((DataRowView)rEKLAMABindingSource.Current).Row;
            }
        }

        public static OrderDetails getOrderDetails()
        {
            if (orderDetails == null) orderDetails = new OrderDetails();

            return orderDetails;
        }

        private OrderDetails()
        {
            Debug.WriteLine(string.Format("Event: {0}", "Constructor"));
            
            InitializeComponent();


            TitleRepository titleRepository = new TitleRepository(ConnString.getConnString().Value);
            _titles = titleRepository.FindAllActive();

            AdLocationRepository adPlacementRepository = new AdLocationRepository(ConnString.getConnString().Value);
            ComboBoxHelper.Bind(adPlacementRepository.FindAll(), cbLocation);
            cbLocation.DisplayMember = "Text";
            cbLocation.ValueMember = "Id";
            cbLocation.SelectedIndex = 0;

            ComboBoxHelper.Bind(_titles, tYTULComboBox);
            tYTULComboBox.DisplayMember = "ShortName";
            tYTULComboBox.ValueMember = "ShortName";

            grzbietComboBox.DisplayMember = "Name";
            grzbietComboBox.ValueMember = "Id";

            mOD_TYPComboBox.DisplayMember = "Name";
            mOD_TYPComboBox.ValueMember = "Name";

            rEKLAMADataSet.UKAZE_SIE_W_NR.Constraints.Remove("FAKTURY_UKAZE_SIE_W_NR");

            errProvider = new ErrorProvider();

            // funckje formatujące Decimal <-> %
            rABATTextBox.DataBindings[0].Format += DecimalToProcent;
            rABATTextBox.DataBindings[0].Parse += ProcentToDecimal;

            pROCENT_PROWIZJITextBox.DataBindings[0].Format += DecimalToProcent;
            pROCENT_PROWIZJITextBox.DataBindings[0].Parse += ProcentToDecimal;

            pVATComboBox.DataBindings[0].Format += DecimalToProcent;
            pVATComboBox.DataBindings[0].Parse += ProcentToDecimal;

            rEKLAMADataSet.UKAZE_SIE_W_NR.TableNewRow += nowaEmisja;

            pROMOCJETableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            lISTA_TYPOW_REKLAMYTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            kursy_WalutTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            rEKLAMATableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            uKAZE_SIE_W_NRTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            rEKLAMA_STRONATableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            reklama_Info_DodTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            aGENCITableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            zmianyEmisjiTableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;

            pROMOCJETableAdapter.Fill(sLOWNIKDataSet.PROMOCJE);

            if (User.Instance().IsKierownik || User.Instance().IsProdukcja)
                lISTA_TYPOW_REKLAMYTableAdapter.Fill(sLOWNIKDataSet.LISTA_TYPOW_REKLAMY);
            else
                lISTA_TYPOW_REKLAMYTableAdapter.FillByBezBezplatnych(sLOWNIKDataSet.LISTA_TYPOW_REKLAMY);

            aGENCITableAdapter.FillByAktywny(sLOWNIKDataSet.AGENCI);

            usunToolStripMenuItem.Click += UsunEmisje;
            anulujToolStripMenuItem.Click += AnulujEmisje;
            zmienToolStripMenuItem.Click += ZmienEmisje;

            walutyComboBox.SelectedIndex = 0;
        }

        private void OrderDetails_Load(object sender, EventArgs e)
        {
            wyroznienie_exportedCheckBox.Enabled = User.Instance().IsProdukcja;
            errProvider.Clear();
        }

        /// <summary>
        /// Filtruje moduły i grzbiety wg tytułu gazety.
        /// </summary>
        private void tYTULComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!obslugaZdarzen) return;

            Debug.WriteLine(string.Format("Event: {0}", "tYTULComboBox_SelectedIndexChanged"));

            if (SelectedTitle != null)
            {
                TitleRepository titleRepository = new TitleRepository(ConnString.getConnString().Value);
                List<Section> sections = titleRepository.FindSectionsByTitle(SelectedTitle);

                ComboBoxHelper.Bind(sections, grzbietComboBox);
                if (sections.Count > 1)
                {
                    grzbietComboBox.Items.Insert(0, new Section(0, null, "--proszę wybrać--"));
                    if (sections.Count != 0)
                        grzbietComboBox.SelectedIndex = 0;
                }
                else if (sections.Count == 1)
                {
                    SectionRepository sectionRepository = new SectionRepository(ConnString.getConnString().Value);
                    List<Module> modules = sectionRepository.FindModulesBySection(SelectedSection);
                    
                    grzbietComboBox.SelectedIndex = 0;
                    ComboBoxHelper.Bind(modules, mOD_TYPComboBox);

                    if (modules.Count > 1)
                        mOD_TYPComboBox.Items.Insert(0, new Module(0, "--proszę wybrać--"));
                    if (modules.Count != 0)
                        mOD_TYPComboBox.SelectedIndex = 0;
                }

                iD_REKLAMYTextBox.Text = (nowyRekord) ? numeryReklam[SelectedTitle.ShortName] : iD_REKLAMYTextBox.Text;
            }
        }

        private void grzbietComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!obslugaZdarzen) return;

            Debug.WriteLine(string.Format("Event: {0}", "grzbietComboBox_SelectedIndexChanged"));
            
            if (SelectedSection == null) return;

            txtHorizontal.Text = 1.ToString();
            txtVertical.Text = 1.ToString();

            SectionRepository sectionRepository = new SectionRepository(ConnString.getConnString().Value);
            List<Module> modules = sectionRepository.FindModulesBySection(SelectedSection);

            ComboBoxHelper.Bind(modules, mOD_TYPComboBox);
            if (modules.Count > 1)
                mOD_TYPComboBox.Items.Insert(0, new Module(0, "--proszę wybrać--"));
            if (modules.Count != 0)
                mOD_TYPComboBox.SelectedIndex = 0;

            iD_REKLAMYTextBox.Text = (nowyRekord) ? numeryReklam[SelectedTitle.ShortName] : iD_REKLAMYTextBox.Text;
        }

        private void anulujButton_Click(object sender, EventArgs e)
        {
            if (nowyRekord)
            {
                //usuwa dodany wczesniej do bazy wiersz
                if (rEKLAMABindingSource.Current != null)
                {
                    rEKLAMABindingSource.RemoveCurrent();
                    rEKLAMABindingSource.EndEdit();
                    rEKLAMATableAdapter.Update(rEKLAMADataSet.REKLAMA);
                }
            }
            else
            {
                //usuwa zmiany w zleceniu
                rEKLAMADataSet.REKLAMA.RejectChanges();
                rEKLAMADataSet.UKAZE_SIE_W_NR.RejectChanges();
            }

            obslugaZdarzen = false;
            liczbaEmisjiLabel.Text = "-";

            ResetComboBoxes();

            DialogResult = bylyZmiany ? DialogResult.OK : DialogResult.Cancel;
        }

        private void ResetComboBoxes()
        {
            Debug.WriteLine(string.Format("Event: {0}", "ResetComboBoxes"));

            tYTULComboBox.SelectedIndex = -1;
            cbLocation.SelectedIndex = 0;
            grzbietComboBox.Items.Clear();
            mOD_TYPComboBox.Items.Clear();
            ogl_dzialComboBox.SelectedIndex = -1;
            ogl_rozdzialComboBox.SelectedIndex = -1;
            ogl_dzialComboBox.Items.Clear();
            ogl_rozdzialComboBox.Items.Clear();
        }

        /// <summary>
        /// Zapisuje zmiany w wierszu oraz dodaje rekordy do "UKAZE SIE W NR" i "InfoDod"
        /// </summary>
        private void dodajButton_Click(object sender, EventArgs e)
        {
            if (!ValidateChildren())
            {
                MessageBox.Show("Proszę uzupełnić wymagane pola.");
                return;
            }

            Cursor = Cursors.WaitCursor;

            SaveChanges();

            MessageBox.Show("Zmiany zapisane");
            Cursor = Cursors.Default;
        }

        private void btnSaveClose_Click(object sender, EventArgs e)
        {
            if (!ValidateChildren())
            {
                MessageBox.Show("Proszę uzupełnić wymagane pola.");
                return;
            }

            Cursor = Cursors.WaitCursor;

            SaveChanges();

            MessageBox.Show("Zmiany zapisane");
            Cursor = Cursors.Default;
            Close();
        }

        private void SaveChanges()
        {
            Reklama.MOD_TYP = SelectedModule.Name;
            Reklama.TYTUŁ = SelectedTitle.ShortName;
            Reklama.GRZBIET = SelectedSection.Id;
            Reklama.AdLocationId = SelectedAdLocation.Id;
            Reklama.KOLOR = lblKolor.Text;

            if (SelectedNavigationColumn != null && SelectedNavigationColumn.Id > 0)
            {
                Reklama.ogl_dzial = SelectedNavigationColumn.Id;

                if (SelectedNavigationSubColumn != null && SelectedNavigationSubColumn.Id > 0)
                    Reklama.ogl_rozdzial = SelectedNavigationSubColumn.Id;
                else
                {
                    DataRowView row = (DataRowView)rEKLAMABindingSource.Current;
                    row["ogl_rozdzial"] = DBNull.Value;
                    rEKLAMABindingSource.EndEdit();
                }
            }
            else
            {
                DataRowView row = (DataRowView)rEKLAMABindingSource.Current;
                row["ogl_dzial"] = DBNull.Value;
                row["ogl_rozdzial"] = DBNull.Value;
                rEKLAMABindingSource.EndEdit();
            }

            if (string.IsNullOrEmpty(promocjaComboBox.Text))
            {
                DataRowView row = (DataRowView)rEKLAMABindingSource.Current;
                row["PROMOCJA"] = DBNull.Value;
            }
            else
                Reklama.PROMOCJA = Convert.ToInt32(((DataRowView)promocjaComboBox.SelectedItem).Row[0]);

            if (nowyRekord)
                Reklama.ModulePrice = SelectedModule.Price;

            rEKLAMABindingSource.EndEdit();

            REKLAMADataSet.REKLAMARow reklama = Reklama;

            if (wyroznienieCheckBox.Checked ^ Convert.ToDecimal(reklama.wyroznienie_kwota) != 0)
            {
                MessageBox.Show("Została zmieniona opcja wyróżnienia. Zamówienie należy ponownie przeliczyć");
                Cursor = Cursors.Default;
                return;
            }

            reklama.USERID = User.Instance().Login;

            rEKLAMAUKAZESIEWNRBindingSource.EndEdit();
            rEKLAMAReklamaInfoDodBindingSource.EndEdit();

            rEKLAMATableAdapter.Update(rEKLAMADataSet.REKLAMA);
            uKAZE_SIE_W_NRTableAdapter.Update(rEKLAMADataSet.UKAZE_SIE_W_NR);
            reklama_Info_DodTableAdapter.Update(rEKLAMADataSet.Reklama_Info_Dod);
            zmianyEmisjiTableAdapter.Update(rEKLAMADataSet.zmianyEmisji);

            Zmiany();

            nowyRekord = false;
            bylyZmiany = true;

            //jesli reklama posiada zamowienie i wszystkie emisje zafakturowane dla danego zamowienia to ustaw zamowienie aby bylo w calosci zafakturowane 
            if (!reklama.IsidZamowieniaNull() && !HasEmisjeDoZafakturowania(rEKLAMADataSet.UKAZE_SIE_W_NR))
                ZamowienieHelper.MakeZamowienieZafakturowane(reklama.idZamowienia);

            ukazeSieDataGridView.Sort(ukazeSieDataGridView.Columns[0], ListSortDirection.Ascending);
        }

        private static bool HasEmisjeDoZafakturowania(REKLAMADataSet.UKAZE_SIE_W_NRDataTable emisje)
        {
            foreach (REKLAMADataSet.UKAZE_SIE_W_NRRow emisja in emisje.Rows)
            {
                if (emisja.IsidFakturyNull()) return true;
            }

            return false;
        }

        private void zATWIERDZONO_DO_DRUKUCheckBox_Click(object sender, EventArgs e)
        {
            if (!zATWIERDZONO_DO_DRUKUCheckBox.Checked || rEKLAMABindingSource.Current == null) return;

            REKLAMADataSet.REKLAMARow reklama =
                (REKLAMADataSet.REKLAMARow) ((DataRowView) rEKLAMABindingSource.Current).Row;

            SprawdzBledy();

            if (!User.Instance().IsKierownik && reklama.IsPROMOCJANull())
            {
                if (Convert.ToDouble(reklama.RABAT) > SelectedTitle.MaxDiscount)
                {
                    MessageBox.Show("Rabat wyższy niż " + SelectedTitle.MaxDiscount.ToString("P") +
                                    ". Zamówienie musi być zatwierdzone do druku przez kierownika");
                    zATWIERDZONO_DO_DRUKUCheckBox.CheckState = CheckState.Unchecked;
                }

                if (SelectedModule != null)
                {
                    decimal cenaJedn = Convert.ToDecimal(reklama.NETTO)/
                                       (Convert.ToDecimal(reklama.SZER)*Convert.ToDecimal(reklama.WYS)*
                                        Convert.ToDecimal(reklama.KROTNOŚĆ));
                    cenaJedn = Math.Round(cenaJedn, 2);

                    if ((cenaJedn < SelectedModule.MinPrice))
                    {
                        MessageBox.Show(
                            "Cena modułu niższa niż cena cennikowa. Zamówienie musi być zatwierdzone do druku przez kierownika");
                        zATWIERDZONO_DO_DRUKUCheckBox.CheckState = CheckState.Unchecked;
                    }
                }

                string typ = Convert.ToString(reklama.TYP);
                if (((typ == "BEZPŁATNA") || (typ == "BARTER") || (typ == "REKLAMACJA")) && !User.Instance().IsProdukcja)
                {
                    MessageBox.Show("Zamówienie musi być zatwierdzone do druku przez kierownika");
                    zATWIERDZONO_DO_DRUKUCheckBox.CheckState = CheckState.Unchecked;
                }
            }
        }

        private void pROCENT_PROWIZJITextBox_Leave(object sender, EventArgs e)
        {
            rEKLAMABindingSource.EndEdit();
        }

        /// <summary>
        /// Blokuje część formuklarze w zależności od stanu zamówienia i praw użytkownika...
        /// </summary>
        private void OrderDetails_Shown(object sender, EventArgs e)
        {
            // BindingSource sa resetowane, by ustawily sie wszytskie filtry
            kurs = null;

            obslugaZdarzen = true;

            BlokowanieZrealizowanychEmisji();

            Zmiany();

            Init();
        }

        private void ukazeSieDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            if (rEKLAMAUKAZESIEWNRBindingSource.Current != null)
            {
                rEKLAMAUKAZESIEWNRBindingSource.RemoveCurrent();
            }
            BlokowanieZrealizowanychEmisji();
        }

        private void ukazeSieDataGridView_Leave(object sender, EventArgs e)
        {
            Validate();

            rEKLAMAUKAZESIEWNRBindingSource.EndEdit();

            if (rEKLAMABindingSource.Current == null) return;

            liczbaEmisjiLabel.Text = rEKLAMAUKAZESIEWNRBindingSource.List.Count.ToString();
            kROTNOSCTextBox.Text = rEKLAMAUKAZESIEWNRBindingSource.List.Count.ToString();
        }

        /// <summary>
        /// Blokuje emisje,które już się ukazały.
        /// </summary>
        private void BlokowanieZrealizowanychEmisji()
        {
            //TODO: Dodac kolumne DataEmisji do tabeli "Ukaże się w nr"

            Dictionary<int, DateTime> datyEmisji = null;
            if (ukazeSieDataGridView.Rows.Count > 0)
                datyEmisji = ReklamaHelper.GetDatyEmisji(Convert.ToInt32(ukazeSieDataGridView.Rows[0].Cells["ReklamaId"].Value));

            DateTime firstDayOfCurrentMonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
            
            //  ukazeSieDataGridView.Enabled = true; 
            foreach (DataGridViewRow r in ukazeSieDataGridView.Rows)
            {
                REKLAMADataSet.UKAZE_SIE_W_NRRow em =
                    (REKLAMADataSet.UKAZE_SIE_W_NRRow) ((DataRowView) r.DataBoundItem).Row;

                if (datyEmisji != null && datyEmisji.ContainsKey(em.Nr_Wydania))
                {
                    if (datyEmisji[em.Nr_Wydania] < firstDayOfCurrentMonth)
                    {
                        r.ReadOnly = true;
                        r.DefaultCellStyle.BackColor = Color.MintCream;
                    }
                }

                //anulowana
                if (em.status == 2)
                {
                    r.ReadOnly = true;
                    r.DefaultCellStyle.ForeColor = Color.Red;
                }

                if (r.ReadOnly && r.DefaultCellStyle.BackColor == Color.MintCream) continue;

                foreach (DataGridViewRow s in ukazaloSieDataGridView.Rows)
                {
                    if (em.Nr_Wydania.ToString() == s.Cells["NR_WYDANIA"].Value.ToString())
                    {
                        r.ReadOnly = true;
                        r.DefaultCellStyle.BackColor = Color.MintCream;
                        break;
                    }
                }
            }
        }

        public void ZablokujGroupBoxa(GroupBox g)
        {
            foreach (Control c in g.Controls)
            {
                if (c is TextBox)
                {
                    ((TextBox)c).ReadOnly = true;
                }

                if (c is ComboBox)
                {
                    c.Enabled = false;
                }
            }
        }

        public void OdblokujGroupBoxa(GroupBox g)
        {
            foreach (Control c in g.Controls)
            {
                if (c is TextBox)
                {
                    ((TextBox)c).ReadOnly = false;
                }

                if (c is ComboBox)
                {
                    c.Enabled = true;
                }
            }
        }

        /// <summary>
        /// Blokuje kontrolki związane z danymi zamówienia
        /// </summary>
        private void ZablokujGroupBoxy()
        {
            ZablokujGroupBoxa(groupBox1);

            if (!(User.Instance().IsProdukcja | User.Instance().IsKierownik))
            {
                ZablokujGroupBoxa(groupBox2);
            }
            ZablokujGroupBoxa(groupBox3);
            ZablokujGroupBoxa(groupBox4);

            //lokalizacje można zmieniać
            sTRONATextBox.ReadOnly = false;

        }

        /// <summary>
        /// Odblokuje kontrolki związane z danymi zamówienia
        /// </summary>
        private void OdblokujGroupBoxy()
        {
            OdblokujGroupBoxa(groupBox1);
            OdblokujGroupBoxa(groupBox2);
            OdblokujGroupBoxa(groupBox3);
            OdblokujGroupBoxa(groupBox4);
        }

        /// <summary>
        /// Buduje nr zamowienia dla danego handlowca
        /// </summary>
        private string GetIdReklamy(string symAgenta, string tagAgenta)
        {
            if (!User.Instance().IsHandlowiec)
                return ""; 

            string nr = DbUtils.numerNowejReklamy(symAgenta, tagAgenta).ToString();
            switch (nr.Length) 
            {
                case 1:
                    nr = tagAgenta + "00" + nr + "_00";
                    break;
                case 2:
                    nr = tagAgenta + "0" + nr + "_00";
                    break;
                case 3:
                    nr = tagAgenta + nr + "_00";
                    break;
            }
            return nr;
        }

        /// <summary>
        /// Sprawdza poprawność zamówienia... pewnie niekompletnie
        /// </summary>
        private void SprawdzBledy()
        {
            if (SelectedModule == null)
            {
                MessageBox.Show("Wybierz rodzaj modułu.");
                zATWIERDZONO_DO_DRUKUCheckBox.CheckState = CheckState.Unchecked;
                return;
            }

            if (SelectedSection == null)
            {
                MessageBox.Show("Wybierz grzbiet.");
                zATWIERDZONO_DO_DRUKUCheckBox.CheckState = CheckState.Unchecked;
                return;
            }

            ////lokalizacja
            //if (sTRONATextBox.Text == "")
            //{
            //    MessageBox.Show("Podaj lokalizację.");
            //    zATWIERDZONO_DO_DRUKUCheckBox.CheckState = CheckState.Unchecked;
            //    return;
            //}

            if (rEKLAMAUKAZESIEWNRBindingSource.List.Count != 0) return;

            MessageBox.Show("Brak wyznaczonych emisji.");
            zATWIERDZONO_DO_DRUKUCheckBox.CheckState = CheckState.Unchecked;
            return;
        }

        /// <summary>
        /// Przelicza wartość zamówienia.
        /// </summary>
        private void Przelicz()
        {
            DataRowView row = (DataRowView)rEKLAMABindingSource.Current;

            if ((row["KROTNOŚĆ"] != null) && (row["CENA JEDN"] != null) && (row["VAT"] != null)
              && (row["PROCENT PROWIZJI"] != null) && (row["RABAT"] != null)
              && (row["SZER"] != null) && (row["WYS"] != null))
            {
                int szer = Convert.ToInt32(row["SZER"]);
                int wys = Convert.ToInt32(row["WYS"]);
                int krotnosc = Convert.ToInt32(row["KROTNOŚĆ"]);

                if (krotnosc == 0)
                {
                    MessageBox.Show("Ilość emisji równa się  0");
                    return;
                }

                decimal cenaJednostkowa = Convert.ToDecimal(row["CENA JEDN"]);
                decimal vatProcent = Convert.ToDecimal(row["VAT"]);
                decimal prowizjaProcent = Convert.ToDecimal(row["PROCENT PROWIZJI"]);
                decimal rabatProcent = Convert.ToDecimal(row["RABAT"]);


                //rabatWartosc
                decimal rabatWartosc = rabatProcent * cenaJednostkowa;
                rabatWartosc = Math.Round(rabatWartosc, 2);

                //netto
                decimal _netto = (cenaJednostkowa - rabatWartosc) * krotnosc;
                _netto = Math.Round(_netto, 2);

                nettoBezBOTextBox.Text = String.Format("{0:C}", _netto);

                //cena modulu
                decimal cenaModulu = _netto / (szer * wys * krotnosc);
                cenaModulu = Math.Round(cenaModulu, 2);

                if (Convert.ToBoolean(row["wyroznienie"]))
                {
                    row["wyroznienie_procent"] = 0.15M;
                    decimal kwotaWyroznienia = Math.Round(_netto * 0.15M, 2);
                    row["wyroznienie_kwota"] = kwotaWyroznienia;
                    _netto = _netto + kwotaWyroznienia;
                }
                else
                {
                    row["wyroznienie_procent"] = 0;
                    row["wyroznienie_kwota"] = 0;
                }

                //vatWartosc
                decimal vatWartosc = vatProcent * _netto;
                vatWartosc = Math.Round(vatWartosc, 2);

                //brutto
                decimal brutto = _netto + vatWartosc;
                brutto = Math.Round(brutto, 2);

                //prowizja
                decimal prowizjaWartosc = prowizjaProcent * _netto;
                prowizjaWartosc = Math.Round(prowizjaWartosc, 2);

                cenaModuluLabel.Text = String.Format("{0:C}", cenaModulu);
                row["RABAT WARTOŚĆ"] = rabatWartosc.ToString();
                row["NETTO"] = _netto.ToString();
                row["BRUTTO"] = brutto.ToString();
                row["PVAT"] = vatWartosc.ToString();
                row["PROWIZJA"] = prowizjaWartosc.ToString();

                rEKLAMABindingSource.EndEdit();
            }

        }

        /// <summary>
        /// Przelicza kwotę w walucie na złotówki.
        /// </summary>
        private void PrzeliczWaluteNaZlotowki(SLOWNIKDataSet.Kursy_WalutRow kursWaluty)
        {
            DataRowView row = (DataRowView)rEKLAMABindingSource.Current;

            if (row["Brutto_Euro"] == DBNull.Value) return;

            // waluty
            row["waluta_tabela_nr"] = kursWaluty.Numer_Tabeli;
            row["waluta_Przelicznik"] = kursWaluty.przelicznik;
            row["waluta_kurs"] = kursWaluty.Kurs_Sredni;
            row["waluta_kurs_z_dnia"] = kursWaluty.Data_Publikacji;
            row["Brutto_Euro_Miano"] = kursWaluty.Kod_Waluty;

            //zmiana kursu dla poznania
            if (User.Instance().IdAgencji == 6)
            {
                row["waluta_kurs"] = kursWaluty.Kurs_Sredni_Poznan;
            }

            int szer = Convert.ToInt32(row["SZER"]);
            int wys = Convert.ToInt32(row["WYS"]);
            int krotnosc = Convert.ToInt32(row["KROTNOŚĆ"]);

            if (krotnosc == 0)
            {
                MessageBox.Show("Ilość emisji równa się  0");
                return;
            }

            decimal vatProcent = Convert.ToDecimal(row["VAT"]);
            decimal prowizjaProcent = Convert.ToDecimal(row["PROCENT PROWIZJI"]);
            decimal rabatProcent = Convert.ToDecimal(row["RABAT"]);

            //przeliczanie z waluty na zlotowki   
            decimal brutto = Math.Round(Convert.ToDecimal(row["Brutto_Euro"]) * Convert.ToDecimal(row["waluta_kurs"]) / Convert.ToInt32(row["waluta_Przelicznik"]), 2);

            decimal _netto = brutto / (1 + vatProcent);
            _netto = Math.Round(_netto, 2);

            decimal nettoZBO = _netto;

            if (Convert.ToBoolean(row["wyroznienie"]))
            {
                row["wyroznienie_procent"] = 0.15M;
                decimal nettoBezBO = Math.Round(_netto / 1.15M, 2);
                row["wyroznienie_kwota"] = Math.Round(_netto - nettoBezBO, 2);
                _netto = nettoBezBO;
            }
            else
            {
                row["wyroznienie_procent"] = 0;
                row["wyroznienie_kwota"] = 0;
            }

            nettoBezBOTextBox.Text = String.Format("{0:C}", _netto);

            decimal vatWartosc = vatProcent * nettoZBO;
            vatWartosc = Math.Round(vatWartosc, 2);

            decimal prowizjaWartosc = prowizjaProcent * nettoZBO;
            prowizjaWartosc = Math.Round(prowizjaWartosc, 2);

            decimal rabatWartosc = _netto * rabatProcent / (krotnosc * (1 - rabatProcent));
            rabatWartosc = Math.Round(rabatWartosc, 2);

            decimal cenaJednostkowa = (_netto / krotnosc) + rabatWartosc;
            cenaJednostkowa = Math.Round(cenaJednostkowa, 2);

            //cena modulu
            decimal cenaModulu = _netto / (szer * wys * krotnosc);
            cenaModulu = Math.Round(cenaModulu, 2);

            cenaModuluLabel.Text = String.Format("{0:C}", cenaModulu);
            row["RABAT WARTOŚĆ"] = rabatWartosc.ToString();
            row["NETTO"] = nettoZBO.ToString();
            row["BRUTTO"] = brutto.ToString();
            row["PVAT"] = vatWartosc.ToString();
            row["PROWIZJA"] = prowizjaWartosc.ToString();
            row["CENA JEDN"] = cenaJednostkowa.ToString();


            // zmiana domyślnego konta do faktury dla EUR
            if (User.Instance().IdAgencji != 4 & (row["Brutto_Euro_Miano"].ToString() == "EUR"))
            {
                if (User.Instance().IdAgencji == 1223940396 | User.Instance().IdAgencji == 1223940398)
                {
                    row["FAKTURA ID KONTA"] = 3;
                }
                else
                {
                    row["FAKTURA ID KONTA"] = 5;
                }
            }

            rEKLAMABindingSource.EndEdit();
        }

        public void DodajNoweZamowienie(int custId, string kodKlienta)
        {
            nowyRekord = true;
            bylyZmiany = false;

            numeryReklam.Clear();

            foreach (object item in tYTULComboBox.Items)
            {
                Title title = (Title)item;
                numeryReklam.Add(title.ShortName, GetIdReklamy(User.Instance().Symbol_agenta, title.AdPrefix + User.Instance().Kod_agenta));
            }

            rEKLAMADataSet.REKLAMA.Clear();
            rEKLAMADataSet.UKAZE_SIE_W_NR.Clear();
            rEKLAMADataSet.Reklama_Info_Dod.Clear();

            customerId = custId;

            DataView datatable = (DataView)rEKLAMABindingSource.List;
            DataRowView row = datatable.AddNew();

            row["CustomerId"] = customerId;
            row["DATA ZAMÓWIENIA"] = DateTime.Now;
            row["nick name"] = kodKlienta;

            if (DbUtils.czyKlientMaNrVIES(customerId)) row["VAT"] = 0; 

            if (User.Instance().IsHandlowiec)
            {
                row["symbol akwizytora"] = User.Instance().Symbol_agenta;
                row["ID Reklamy"] = numeryReklam[_titles[0].ShortName];

                //TODO: find out if these two lines below are still valid
                //Katowice
                if (User.Instance().IdAgencji == 4) row["customerId_Sub"] = 678;
                //Poznan
                if (User.Instance().IdAgencji == 6) row["customerId_Sub"] = 18845;
            }

            row["USERID"] = User.Instance().Login;

            obslugaZdarzen = true;
            tYTULComboBox.SelectedIndex = 0;
            moduleInfo.Visible = false;
            obslugaZdarzen = false;

            rEKLAMABindingSource.EndEdit();
            rEKLAMATableAdapter.Update(rEKLAMADataSet.REKLAMA);
            rEKLAMABindingSource.MoveLast();
        }

        public void PokazSzczegolyZamowienia(int rekId)
        {
            nowyRekord = false;
            bylyZmiany = false;
            reklamaId = rekId;

            rEKLAMATableAdapter.ClearBeforeFill = true;
            rEKLAMATableAdapter.FillByReklamaId(rEKLAMADataSet.REKLAMA, reklamaId);
            reklama_Info_DodTableAdapter.FillByReklamaId(rEKLAMADataSet.Reklama_Info_Dod, reklamaId);
            rEKLAMA_STRONATableAdapter.FillByReklamaId(rEKLAMADataSet.REKLAMA_STRONA, reklamaId);
            uKAZE_SIE_W_NRTableAdapter.FillByReklamaId(rEKLAMADataSet.UKAZE_SIE_W_NR, reklamaId);
            


            //Set ComboBox selected item
            obslugaZdarzen = true;
            tYTULComboBox.SelectedIndex = tYTULComboBox.FindString(Reklama.TYTUŁ);
            cbLocation.SelectedIndex = GetAdLocationIndex(Reklama.AdLocationId);
            grzbietComboBox.SelectedIndex = GetSectionIndex(Reklama.GRZBIET);
            mOD_TYPComboBox.SelectedIndex = mOD_TYPComboBox.FindString(Reklama.MOD_TYP);

            if (Reklama.IsPROMOCJANull())
                promocjaComboBox.SelectedIndex = -1;
            else
                promocjaComboBox.SelectedIndex = GetPromotionIndex(Reklama.PROMOCJA);

            obslugaZdarzen = false;
        }

        private int GetSectionIndex(int value)
        {
            foreach (object item in grzbietComboBox.Items)
                if (item is Section && ((Section)item).Id == value)
                    return grzbietComboBox.Items.IndexOf(item);

            return -1;
        }

        private int GetAdLocationIndex(int value)
        {
            foreach (object item in cbLocation.Items)
                if (item is AdLocation && ((AdLocation)item).Id == value)
                    return cbLocation.Items.IndexOf(item);

            return -1;
        }

        private int GetNavigationColumnIndex(int value)
        {
            foreach (object item in ogl_dzialComboBox.Items)
                if (item is NavigationColumn && ((NavigationColumn)item).Id == value)
                    return ogl_dzialComboBox.Items.IndexOf(item);

            return -1;
        }

        private int GetNavigationSubColumnIndex(int value)
        {
            foreach (object item in ogl_rozdzialComboBox.Items)
                if (item is NavigationSubColumn && ((NavigationSubColumn)item).Id == value)
                    return ogl_rozdzialComboBox.Items.IndexOf(item);

            return -1;
        }

        private int GetPromotionIndex(int value)
        {
            int index = -1;
            foreach (object item in promocjaComboBox.Items)
            {
                index++;
                if (item is DataRowView && Convert.ToInt32(((DataRowView)item).Row[0]) == value)
                    return index;                
            }

            return -1;
        }

        public void WznowZamowienie(int rekId)
        {
            Debug.WriteLine(string.Format("Event: {0}", "WznowZamowienie"));

            nowyRekord = true;
            bylyZmiany = false;

            REKLAMADataSet.REKLAMADataTable old = rEKLAMATableAdapter.GetDataByReklamaId(rekId);
            DataRow oldRow = old.Rows[0];

            rEKLAMADataSet.REKLAMA.Clear();
            rEKLAMADataSet.UKAZE_SIE_W_NR.Clear();
            rEKLAMADataSet.Reklama_Info_Dod.Clear();

            DataView datatable = (DataView) rEKLAMABindingSource.List;
            DataRowView newRow = datatable.AddNew();

            customerId = Convert.ToInt32(oldRow["CustomerID"]);

            newRow["CustomerID"] = oldRow["CustomerID"];
            newRow["DATA ZAMÓWIENIA"] = DateTime.Now;
            newRow["SYMBOL AKWIZYTORA"] = oldRow["SYMBOL AKWIZYTORA"];
            newRow["ID REKLAMY"] = oldRow["ID REKLAMY"];
            newRow["TYTUŁ"] = oldRow["TYTUŁ"];
            newRow["TYP"] = oldRow["TYP"];
            newRow["NICK NAME"] = oldRow["NICK NAME"];
            newRow["SZER"] = oldRow["SZER"];
            newRow["WYS"] = oldRow["WYS"];
            newRow["MOD_TYP"] = oldRow["MOD_TYP"];
            newRow["KROTNOŚĆ"] = 0;
            newRow["ODSTĘP"] = oldRow["ODSTĘP"];
            newRow["KOLOR"] = oldRow["KOLOR"];
            newRow["RABAT"] = oldRow["RABAT"];
            newRow["CENA JEDN"] = oldRow["CENA JEDN"];
            newRow["VAT"] = oldRow["VAT"];
            newRow["PROCENT PROWIZJI"] = oldRow["PROCENT PROWIZJI"];
            newRow["PROMOCJA"] = oldRow["PROMOCJA"];
            newRow["GRZBIET"] = oldRow["GRZBIET"];
            newRow["STRONA"] = oldRow["STRONA"];
            newRow["customerId_Sub"] = oldRow["customerId_Sub"];
            newRow["ogl_dzial"] = oldRow["ogl_dzial"];
            newRow["ogl_rozdzial"] = oldRow["ogl_rozdzial"];
            newRow["AdLocationId"] = oldRow["AdLocationId"];

            //zmiana numerka
            try
            {
                string starySym = newRow["Id reklamy"].ToString();
                string symPart1 = starySym.Substring(0, starySym.Length - 2);
                string symPart2 = starySym.Substring(starySym.Length - 2, 2);
                int nowyNr = Int32.Parse(symPart2);
                nowyNr++;
                switch (nowyNr.ToString().Length)
                {
                    case 1:
                        newRow["Id reklamy"] = symPart1 + "0" + nowyNr;
                        break;
                    default:
                        newRow["Id reklamy"] = symPart1 + nowyNr;
                        break;
                }
            }
            catch (Exception)
            {
                newRow["Id reklamy"] = oldRow["Id reklamy"];
            }

            numeryReklam.Clear();

            foreach (object item in tYTULComboBox.Items)
            {
                Title title = (Title) item;
                numeryReklam.Add(title.ShortName,
                                 GetIdReklamy(User.Instance().Symbol_agenta, title.AdPrefix + User.Instance().Kod_agenta));
            }

            obslugaZdarzen = true;
            tYTULComboBox.SelectedIndex = tYTULComboBox.FindString(newRow["TYTUŁ"].ToString());
            grzbietComboBox.SelectedIndex = GetSectionIndex(Convert.ToInt32(newRow["GRZBIET"]));
            mOD_TYPComboBox.SelectedIndex = mOD_TYPComboBox.FindString(newRow["MOD_TYP"].ToString());
            cbLocation.SelectedIndex = GetAdLocationIndex(Convert.ToInt32(newRow["AdLocationId"]));

            if (SelectedModule != null)
            {
                AdSize adSize = AdHelper.GetAdSize(Convert.ToInt32(Reklama.SZER), 
                                                   Convert.ToInt32(Reklama.WYS), 
                                                   SelectedModule);

                sZERTextBox.Text = adSize.Width.ToString("#0.00");
                wYSTextBox.Text = adSize.Height.ToString("#0.00");
            }

            obslugaZdarzen = false;

            rEKLAMABindingSource.EndEdit();
            rEKLAMATableAdapter.Update(rEKLAMADataSet.REKLAMA);
        }

        private void dataGridView1_RowLeave(object sender, DataGridViewCellEventArgs e)
        {
            DataRowView rowView = dataGridView1[e.ColumnIndex, e.RowIndex].OwningRow.DataBoundItem as DataRowView;

            if ((rowView != null) && rowView.IsNew)
            {
                rowView["Data"] = DateTime.Now;
            }

            dataGridView1.Refresh();
        }

        private void dataGridView1_Leave(object sender, EventArgs e)
        {
            dataGridView1.EndEdit();

            rEKLAMAReklamaInfoDodBindingSource.EndEdit();
        }

        private void OrderDetails_FormClosing(object sender, FormClosingEventArgs e)
        {
            Debug.WriteLine(string.Format("Event: {0}", "FormClosing"));

            if (nowyRekord)
            {
                if (rEKLAMABindingSource.Current != null)
                {
                    rEKLAMABindingSource.RemoveCurrent();
                    rEKLAMABindingSource.EndEdit();
                    rEKLAMATableAdapter.Update(rEKLAMADataSet.REKLAMA);
                }

            }
            else
            {
                //usuwa zmiany w zleceniu           
                rEKLAMADataSet.REKLAMA.RejectChanges();
                rEKLAMADataSet.UKAZE_SIE_W_NR.RejectChanges();
            }

            obslugaZdarzen = false;
            liczbaEmisjiLabel.Text = "-";
            nettoBezBOTextBox.Clear();
            kurs = null;
            ResetComboBoxes();
            DialogResult = bylyZmiany ? DialogResult.OK : DialogResult.Cancel;
        }

        /// <summary>
        /// Koloruje formularz, blokuje pola etc.
        /// </summary>
        private void Zmiany()
        {
            REKLAMADataSet.REKLAMARow reklama = Reklama;
            if (reklama == null) return;

            bool zablokujProwizje = reklama.zablokuj_prowizje;
            bool zatwiedzonoDoDruku = reklama.IsZATWIERDZONO_DO_DRUKUNull() ? false : reklama.ZATWIERDZONO_DO_DRUKU;
            bool wystawionoFakture = reklama.IsFAKTURA_WYSTAWIONONull() ? false : reklama.FAKTURA_WYSTAWIONO;

            //blokowanie prowizji
            pROWIZJATextBox.ReadOnly = zablokujProwizje;
            pROCENT_PROWIZJITextBox.ReadOnly = zablokujProwizje;

            //oznaczenie ZD
            ZDpanel.BackColor = zatwiedzonoDoDruku ? Color.LightGreen : Color.Red;

            //Uprawnienia
            kier_notatkaTextBox.ReadOnly = !User.Instance().IsKierownik;
            kier_zatwierdzilCheckBox.Enabled = User.Instance().IsKierownik;
            zablokuj_prowizjeCheckBox.Enabled = User.Instance().IsKierownik;

            if (!User.Instance().IsKierownik)
            {
                cENA_JEDNTextBox.ReadOnly = zatwiedzonoDoDruku;
                rABATTextBox.ReadOnly = zatwiedzonoDoDruku;

                if (wystawionoFakture)
                {
                    ZablokujGroupBoxy();
                }
                else
                {
                    OdblokujGroupBoxy();
                }
            }

            BlokowanieZrealizowanychEmisji();
        }

        private void EmailButton_Click(object sender, EventArgs e)
        {
            StringBuilder tresc = new StringBuilder();

            tresc.Append("Potwierdzamy przyjęcie podpisanego zamówienia na publikację reklamy w ");

            if (SelectedTitle.ShortName != "adMoto")
            {
                tresc.Append(" gazecie \"" + SelectedTitle.ShortName + "\"");
            }
            else
            {
                tresc.Append(" portalu internetowym " + SelectedTitle.ShortName);
            }

            tresc.Append(" o wartości " + bRUTTOTextBox.Text + ".");
            //String.Format("{0:P}", cevent.Value);

            tresc.AppendLine("");
            tresc.AppendLine("Reklamy zostaną wyemitowane zgodnie z umową w wydaniu(-ach) nr: \n");

            foreach (DataGridViewRow r in ukazeSieDataGridView.Rows)
            {
                if (r.Cells["nrWydaniaDataGridViewTextBoxColumn"].Value != null)
                {
                    tresc.Append(r.Cells["nrWydaniaDataGridViewTextBoxColumn"].Value + ", ");
                }
            }

            tresc.Remove(tresc.Length - 2, 1);

            tresc.AppendLine(" w/w tytułu i udokumentowane fakturą VAT przesłaną na wskazany adres.");

            MailForm mf = new MailForm(DbUtils.customerId(reklamaId), "Potwierdzenie złożenia zamówienia " + iD_REKLAMYTextBox.Text, "", tresc.ToString());

            mf.ShowDialog();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            ogl_rozdzialComboBox.SelectedIndex = -1;
            ogl_rozdzialComboBox.SelectedIndex = -1;
        }

        private void kalendarzButton_Click(object sender, EventArgs e)
        {
            if (SelectedTitle != null)
            {
                Reklama.TYTUŁ = SelectedTitle.ShortName;
                
                // nie moze byc Copy() bo moze zawierac wiersza do skasowania
                REKLAMADataSet.UKAZE_SIE_W_NRDataTable table =
                    (REKLAMADataSet.UKAZE_SIE_W_NRDataTable)
                    rEKLAMADataSet.UKAZE_SIE_W_NR.Copy();

                KalendarzEmisji kalendarz = new KalendarzEmisji(Reklama, table);

                if (kalendarz.ShowDialog() == DialogResult.OK)
                {
                    DataRow[] rows = kalendarz.Emisje.Select("1=1", "[nr wydania] asc");
                    // this.rEKLAMADataSet.UKAZE_SIE_W_NR.Clear();
                    for (int i = 0; i < rows.Length; i++)
                    {
                        if (rEKLAMADataSet.UKAZE_SIE_W_NR.FindByID(
                            Convert.ToDecimal(rows[i]["id"])) == null)
                        {
                            rEKLAMADataSet.UKAZE_SIE_W_NR.ImportRow(rows[i]);
                        }
                    }

                    kalendarz.Close();

                    ukazeSieDataGridView.EndEdit();
                    rEKLAMAUKAZESIEWNRBindingSource.EndEdit();

                    int il = ukazeSieDataGridView.Rows.Count;
                    kROTNOSCTextBox.Text = il.ToString();
                    liczbaEmisjiLabel.Text = il.ToString();
                    rEKLAMABindingSource.EndEdit();

                    PrzeliczCaleZamowienie();
                }
            }
        }

        private void nowaEmisja(object sender, DataTableNewRowEventArgs e)
        {
            if (!(e.Row is REKLAMADataSet.UKAZE_SIE_W_NRRow)) return;

            ((REKLAMADataSet.UKAZE_SIE_W_NRRow)e.Row).dataDodania = DateTime.Today;
        }

        private void ukazeSieDataGridView_CellContextMenuStripNeeded(object sender, DataGridViewCellContextMenuStripNeededEventArgs e)
        {
            if (e.RowIndex < 0 || e.RowIndex > ukazeSieDataGridView.Rows.Count - 1) return;

            DataGridViewRow clickedRow = ukazeSieDataGridView.Rows[e.RowIndex];

            if (!ukazeSieDataGridView.SelectedRows.Contains(clickedRow))
            {
                e.ContextMenuStrip = null;
                return;
            }

            zmienToolStripMenuItem.Visible = true;
            usunToolStripMenuItem.Visible = true;
            anulujToolStripMenuItem.Visible = false;

            if (ukazeSieDataGridView.SelectedRows.Count == 1)
            {
                if (clickedRow.Selected)
                {
                    DataRowView emisja = (DataRowView)ukazeSieDataGridView.Rows[e.RowIndex].DataBoundItem;
                    REKLAMADataSet.UKAZE_SIE_W_NRRow emisjaRow = (REKLAMADataSet.UKAZE_SIE_W_NRRow)emisja.Row;

                    if (clickedRow.DefaultCellStyle.BackColor == Color.MintCream)
                    {
                        zmienToolStripMenuItem.Visible = false;
                        usunToolStripMenuItem.Visible = !emisjaRow.zafakturowana;
                        anulujToolStripMenuItem.Visible = false;

                        e.ContextMenuStrip = emisjeContextMenuStrip;
                        return;
                    }

                    if (emisjaRow.zafakturowana)
                    {
                        zmienToolStripMenuItem.Visible = emisjaRow.status == 0;
                        usunToolStripMenuItem.Visible = false;
                        anulujToolStripMenuItem.Visible = emisjaRow.status == 0;

                        e.ContextMenuStrip = emisjeContextMenuStrip;
                        return;
                    }
                }
            }

            else if (ukazeSieDataGridView.SelectedRows.Count > 1)
            {
                zmienToolStripMenuItem.Visible = false;
                usunToolStripMenuItem.Visible = true;
                anulujToolStripMenuItem.Visible = false;

                foreach (DataGridViewRow r in ukazeSieDataGridView.SelectedRows)
                {
                    if (r.DefaultCellStyle.BackColor == Color.MintCream)
                    {
                        usunToolStripMenuItem.Visible = false;
                        break;
                    }

                    if (Convert.ToBoolean(((DataRowView)r.DataBoundItem)["zafakturowana"]))
                    {
                        usunToolStripMenuItem.Visible = false;
                        break;
                    }
                }

                e.ContextMenuStrip = emisjeContextMenuStrip;
                return;
            }

            e.ContextMenuStrip = emisjeContextMenuStrip;

        }

        public void UsunEmisje(object sender, EventArgs e)
        {
            foreach (DataGridViewRow r in ukazeSieDataGridView.SelectedRows)
            {
                ukazeSieDataGridView.Rows.Remove(r);
            }

            ukazeSieDataGridView.EndEdit();
            rEKLAMAUKAZESIEWNRBindingSource.EndEdit();

            int il = ukazeSieDataGridView.Rows.Count;
            kROTNOSCTextBox.Text = il.ToString();
            liczbaEmisjiLabel.Text = il.ToString();
            rEKLAMABindingSource.EndEdit();

            PrzeliczCaleZamowienie();

        }

        private void AnulujEmisje(object sender, EventArgs e)
        {
            if (ukazeSieDataGridView.CurrentCell == null) return;

            DataGridViewRow r1 = ukazeSieDataGridView.CurrentCell.OwningRow;

            REKLAMADataSet.UKAZE_SIE_W_NRRow row = (REKLAMADataSet.UKAZE_SIE_W_NRRow)(((DataRowView)r1.DataBoundItem).Row);

            row.status = 2;
            row.dataAnulowania = DateTime.Now;
        }

        private void ZmienEmisje(object sender, EventArgs e)
        {
            REKLAMADataSet.REKLAMARow reklama = Reklama;

            if (reklama == null || SelectedTitle == null || rEKLAMAUKAZESIEWNRBindingSource.Current == null) return;

            REKLAMADataSet.UKAZE_SIE_W_NRRow emisja = (REKLAMADataSet.UKAZE_SIE_W_NRRow)((DataRowView)rEKLAMAUKAZESIEWNRBindingSource.Current).Row;

            REKLAMADataSet.UKAZE_SIE_W_NRDataTable table = (REKLAMADataSet.UKAZE_SIE_W_NRDataTable)rEKLAMADataSet.UKAZE_SIE_W_NR.Copy();

            KalendarzEmisji kalendarz = new KalendarzEmisji(reklama,
                                                            table,
                                                            emisja.Nr_Wydania);

            if (kalendarz.ShowDialog() == DialogResult.OK && kalendarz.NowaEmisja.HasValue)
            {
                short staraEmisja = emisja.Nr_Wydania;

                emisja.Nr_Wydania = kalendarz.NowaEmisja.Value;
                emisja.EndEdit();
                rEKLAMADataSet.UKAZE_SIE_W_NR.EndInit();
                rEKLAMAUKAZESIEWNRBindingSource.ResetBindings(false);

                if (emisja.zafakturowana && (staraEmisja != kalendarz.NowaEmisja))
                    ReklamaHelper.AddUpdateIssueChange((double)emisja.ID, staraEmisja, kalendarz.NowaEmisja.Value);
            }
        }

        private void ukazeSieDataGridView_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
            tYTULComboBox.Enabled = ukazaloSieDataGridView.Rows.Count <= 0;
        }

        private void ukazeSieDataGridView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            BlokowanieZrealizowanychEmisji();
        }

        private void walutyComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!obslugaZdarzen || walutyComboBox.SelectedIndex == -1) return;

            kurs = PobierzKurs(walutyComboBox.SelectedItem.ToString());
            PrzeliczCaleZamowienie();
        }

        private void PrzeliczCaleZamowienie()
        {
            DataRowView row = (DataRowView)rEKLAMABindingSource.Current;
            REKLAMADataSet.REKLAMARow reklama = (REKLAMADataSet.REKLAMARow)row.Row;

            if (walutyComboBox.SelectedIndex != 0)
            {
                if (reklama.IsBrutto_EuroNull())
                {
                    reklama.Brutto_Euro = 0;
                    reklama.EndEdit();
                }

                if (kurs != null)
                {
                    PrzeliczWaluteNaZlotowki(kurs);
                }
                else
                {
                    kurs = PobierzKurs(walutyComboBox.SelectedItem.ToString());

                    if (kurs == null)
                    {
                        MessageBox.Show("Wystąpił błąd!");
                    }
                    else
                    {
                        PrzeliczWaluteNaZlotowki(kurs);
                    }
                }
            }
            else
            {
                if (row["id_faktury"] == DBNull.Value)
                {
                    row["waluta_tabela_nr"] = DBNull.Value;
                    row["waluta_Przelicznik"] = DBNull.Value;
                    row["waluta_kurs"] = DBNull.Value;
                    row["waluta_kurs_z_dnia"] = DBNull.Value;
                    row["Brutto_Euro"] = DBNull.Value;
                    row["Brutto_Euro_Miano"] = DBNull.Value;
                    row["FAKTURA ID KONTA"] = 1;

                    rEKLAMABindingSource.EndEdit();
                    Przelicz();
                }
                else
                {
                    MessageBox.Show("Faktura została już wystawiona!");
                }
            }
        }

        private SLOWNIKDataSet.Kursy_WalutRow PobierzKurs(string kodWaluty)
        {
            SLOWNIKDataSet.Kursy_WalutDataTable kursy = kursy_WalutTableAdapter.GetDataByDataPublikacji(
                kodWaluty, DateTime.Today);

            return kursy.Count == 0 ? null : kursy[0];
        }

        private void brutto_EuroTextBox_Leave(object sender, EventArgs e)
        {
            rEKLAMABindingSource.EndEdit();
            PrzeliczCaleZamowienie();
        }

        private void rABATTextBox_Leave(object sender, EventArgs e)
        {
            rEKLAMABindingSource.EndEdit();
            PrzeliczCaleZamowienie();
        }

        private void pVATComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            rEKLAMABindingSource.EndEdit();
            PrzeliczCaleZamowienie();
        }

        private void cENA_JEDNTextBox_Leave(object sender, EventArgs e)
        {
            rEKLAMABindingSource.EndEdit();
            PrzeliczCaleZamowienie();
        }

        private void wyroznienieCheckBox_Click(object sender, EventArgs e)
        {
            rEKLAMABindingSource.EndEdit();
            PrzeliczCaleZamowienie();

        }

        /// <summary>
        /// formatowanie do decimal -> %
        /// </summary>
        private void DecimalToProcent(object sender, ConvertEventArgs cevent)
        {
            cevent.Value = String.Format("{0:P}", cevent.Value);
        }

        /// <summary>
        /// formatowanie do % -> decimal
        /// </summary>
        private void ProcentToDecimal(object sender, ConvertEventArgs cevent)
        {
            string pom = cevent.Value.ToString();
            if (cevent.Value.ToString().EndsWith("%"))
            {
                pom = cevent.Value.ToString().Substring(0, cevent.Value.ToString().Length - 1);
            }
            decimal p = Decimal.Parse(pom) / 100;
            cevent.Value = p.ToString();
        }

        private void Init()
        {
            Debug.WriteLine(string.Format("Event: {0}", "Init"));

            if (rEKLAMABindingSource.Current == null) return;

            DataRowView row = (DataRowView)rEKLAMABindingSource.Current;
            REKLAMADataSet.REKLAMARow reklama = (REKLAMADataSet.REKLAMARow)row.Row;
            //wyliczona cena modulu
            double szer = reklama.SZER;
            double wys = reklama.WYS;
            int krotnosc = reklama.KROTNOŚĆ;
            double cenaJednostkowa = reklama.CENA_JEDN;
            double rabatProcent = reklama.RABAT;
            double rabatWartosc = rabatProcent * cenaJednostkowa;
            double _netto = (cenaJednostkowa - rabatWartosc) * krotnosc;
            if ((szer * wys * krotnosc) != 0)
            {
                double cenaModulu = _netto / (szer * wys * krotnosc);
                cenaModuluLabel.Text = String.Format("{0:C}", cenaModulu);
            }
            else
            {
                cenaModuluLabel.Text = "---";
            }

            liczbaEmisjiLabel.Text = rEKLAMADataSet.UKAZE_SIE_W_NR.Rows.Count.ToString();

            obslugaZdarzen = false;
            if (!reklama.IsBrutto_Euro_MianoNull())
            {
                walutyComboBox.SelectedItem = reklama.Brutto_Euro_Miano;
            }
            else
            {
                walutyComboBox.SelectedIndex = 0; //PLN
            }
            obslugaZdarzen = true;
        }

        private void cenaEmisjiButton_Click(object sender, EventArgs e)
        {
            if (rEKLAMADataSet.UKAZE_SIE_W_NR.Rows.Count <= 0) return;
            
            CenaEmisji cenaEmisjiForm = new CenaEmisji();
            if (cenaEmisjiForm.ShowDialog() == DialogResult.OK)
            {
                foreach (REKLAMADataSet.UKAZE_SIE_W_NRRow emisja in rEKLAMADataSet.UKAZE_SIE_W_NR)
                {
                    emisja.netto = cenaEmisjiForm.WartoscEmisji;
                }
            }
        }

        private void zablokuj_prowizjeCheckBox_CheckedChanged(object sender, EventArgs e)
        {
            if (rEKLAMABindingSource.Current == null) return;

            DataRowView row = (DataRowView)rEKLAMABindingSource.Current;
            REKLAMADataSet.REKLAMARow reklama = (REKLAMADataSet.REKLAMARow)row.Row;
            pROWIZJATextBox.Text = (reklama.PROCENT_PROWIZJI * reklama.NETTO).ToString();
        }

        private void ukazaloSieDataGridView_CellContextMenuStripNeeded(object sender, DataGridViewCellContextMenuStripNeededEventArgs e)
        {
            //ta opcja tylko dostepna dla produkcji
            if (!User.Instance().IsProdukcja) return;

            DataGridViewRow clickedRow = ukazaloSieDataGridView.Rows[e.RowIndex];

            if (!ukazaloSieDataGridView.SelectedRows.Contains(clickedRow))
            {
                e.ContextMenuStrip = null;
                return;
            }
            deleteItem.Visible = true;
            editItem.Visible = true;
            e.ContextMenuStrip = advertSiteContext;
        }

        private void deleteItem_Click(object sender, EventArgs e)
        {
            if (rEKLAMAREKLAMASTRONABindingSource.Current == null) return;
            REKLAMADataSet.REKLAMA_STRONARow advertSite = (REKLAMADataSet.REKLAMA_STRONARow)((DataRowView)rEKLAMAREKLAMASTRONABindingSource.Current).Row;
            if (advertSite.STRONA > 0) return;
            advertSite.Delete();
            rEKLAMA_STRONATableAdapter.Update(advertSite);
        }

        private void editItem_Click(object sender, EventArgs e)
        {
            DataGridViewRow clickedRow = ukazaloSieDataGridView.SelectedRows[0];
            clickedRow.Cells[2].ReadOnly = false;
            clickedRow.Cells[2].Selected = true;
            ukazaloSieDataGridView.BeginEdit(true);
        }

        private void ukazaloSieDataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (ukazaloSieDataGridView.Columns[e.ColumnIndex].Name != "sTRONADataGridViewTextBoxColumn") return;

            if (!ukazaloSieDataGridView.ReadOnly)
            {
                REKLAMADataSet.REKLAMA_STRONARow advertSite = (REKLAMADataSet.REKLAMA_STRONARow)((DataRowView)rEKLAMAREKLAMASTRONABindingSource.Current).Row;
                advertSite.EndEdit();
                rEKLAMA_STRONATableAdapter.Update(advertSite);
                ukazaloSieDataGridView.Columns[e.ColumnIndex].ReadOnly = true;
            }
        }

        private void mOD_TYPComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!obslugaZdarzen) return;

            Debug.WriteLine(string.Format("Event: {0}", "mOD_TYPComboBox_SelectedIndexChanged"));


            if (SelectedModule == null || SelectedModule.Id == 0)
            {
                moduleInfo.Visible = false;

                ogl_dzialComboBox.SelectedIndex = -1;
                ogl_rozdzialComboBox.SelectedIndex = -1;

                ogl_dzialComboBox.Enabled = false;
                ogl_rozdzialComboBox.Enabled = false;

                return;
            }

            moduleInfo.Visible = true;
            lblModuleDescription.Text = SelectedModule.Description;

            //set the module size
            sZERTextBox.Visible = SelectedModule.Width.HasValue;
            sZERTextBox.Text = SelectedModule.Width.HasValue ? (SelectedModule.Width.Value).ToString("#0") : 1.ToString();

            wYSTextBox.Visible = SelectedModule.Height.HasValue;
            wYSTextBox.Text = SelectedModule.Height.HasValue ? (SelectedModule.Height.Value).ToString("#0") : 1.ToString();

            bool readOnly = !AdHelper.EnableModuleCount(SelectedModule);
            txtHorizontal.ReadOnly = readOnly;
            txtVertical.ReadOnly = readOnly;
            txtHorizontal.BackColor = readOnly ? SystemColors.InactiveCaptionText : Color.White;
            txtVertical.BackColor = readOnly ? SystemColors.InactiveCaptionText : Color.White;

            if (readOnly)
            {
                txtHorizontal.Text = 1.ToString();
                txtVertical.Text = 1.ToString();
            }

            //Enable/Disable dzial rozdzial combos...
            if (SelectedModule.Section.Name != "Ogłoszenia")
            {
                ogl_dzialComboBox.SelectedIndex = -1;
                ogl_rozdzialComboBox.SelectedIndex = -1;

                ogl_dzialComboBox.Items.Clear();
                ogl_rozdzialComboBox.Items.Clear();

                ogl_dzialComboBox.Enabled = false;
                ogl_rozdzialComboBox.Enabled = false;
            }
            else
            {
                ogl_dzialComboBox.Enabled = true;
                ogl_rozdzialComboBox.Enabled = true;

                NavigationColumnRepository navigationColumnRepository = new NavigationColumnRepository(ConnString.getConnString().Value);
                ComboBoxHelper.Bind(navigationColumnRepository.FindAllActiveByTitle(SelectedTitle), ogl_dzialComboBox, new NavigationColumn(0, "-- nieokreślony --"));
                ogl_dzialComboBox.DisplayMember = "Name";
                ogl_dzialComboBox.ValueMember = "Id";
                if (!Reklama.Isogl_dzialNull() && Reklama.ogl_dzial > 0)
                {
                    bool isEventHandlingEnabled = true;

                    if (!obslugaZdarzen)
                    {
                        obslugaZdarzen = true;
                        isEventHandlingEnabled = false;
                    }

                    ogl_dzialComboBox.SelectedIndex = GetNavigationColumnIndex(Reklama.ogl_dzial);
                    if (!Reklama.Isogl_rozdzialNull() && Reklama.ogl_rozdzial > 0)
                        ogl_rozdzialComboBox.SelectedIndex = GetNavigationSubColumnIndex(Reklama.ogl_rozdzial);

                    if (!isEventHandlingEnabled)
                        obslugaZdarzen = false;
                }
            }

            RecalculateAdSize();

            //is module in full color
            if (SelectedModule.Name == "AWEB")
            {
                lblKolor.Text = "B/W";
                lblKolor.ForeColor = Color.Black;
                return;
            }
            lblKolor.Text = "FULL";
            lblKolor.ForeColor = Color.Blue;
        }

        private void txtHorizontal_TextChanged(object sender, EventArgs e)
        {
            Debug.WriteLine(string.Format("Event: {0}", "txtHorizontal_TextChanged"));

            if (Validate())
            {
                RecalculateAdSize();

                //txtTotalModuleAmount.Text =
                //    ReCaluculateModuleAmount(txtHorizontal.Text, txtVertical.Text).ToString();

                //int horizontal, vertical;
                //if (int.TryParse(txtHorizontal.Text, out horizontal) && int.TryParse(txtVertical.Text, out vertical))
                //{
                //    AdSize adSize = AdHelper.GetAdSize(horizontal, vertical, SelectedModule);

                //    sZERTextBox.Text = adSize.Width.ToString();
                //    wYSTextBox.Text = adSize.Height.ToString();
                //}
            }
        }

        private void txtVertical_TextChanged(object sender, EventArgs e)
        {
            Debug.WriteLine(string.Format("Event: {0}", "txtVertical_TextChanged"));

            if (Validate())
            {

                RecalculateAdSize();
                
                //txtTotalModuleAmount.Text =
                //    ReCaluculateModuleAmount(txtHorizontal.Text, txtVertical.Text).ToString();

                //int horizontal, vertical;
                //if (int.TryParse(txtHorizontal.Text, out horizontal) && int.TryParse(txtVertical.Text, out vertical))
                //{
                //    AdSize adSize = AdHelper.GetAdSize(horizontal, vertical, SelectedModule);

                //    sZERTextBox.Text = adSize.Width.ToString();
                //    wYSTextBox.Text = adSize.Height.ToString();
                //}
            }
        }

        private void RecalculateAdSize()
        {
            if (SelectedModule == null) return;


            txtTotalModuleAmount.Text =
                    ReCaluculateModuleAmount(txtHorizontal.Text, txtVertical.Text).ToString();

            int horizontal, vertical;
            if (int.TryParse(txtHorizontal.Text, out horizontal) && int.TryParse(txtVertical.Text, out vertical))
            {
                AdSize adSize = AdHelper.GetAdSize(horizontal, vertical, SelectedModule);

                sZERTextBox.Text = adSize.Width.ToString("#0.00");
                wYSTextBox.Text = adSize.Height.ToString("#0.00");
            }
        }


        private static int ReCaluculateModuleAmount(string horizontal, string vertical)
        {
            int h, v;
            if (int.TryParse(horizontal, out h) && int.TryParse(vertical, out v))
                return h*v;

            return 1;
        }

        //TODO: get the max amount from db
        private void txtHorizontal_Validating(object sender, CancelEventArgs e)
        {
            Debug.WriteLine(string.Format("Event: {0}", "txtHorizontal_Validating"));

            string errorMessage = "Proszę podać wartość z przedziału 1-8.";
            string regex = "^[1-8]{1}$";
            if (SelectedTitle.ShortName == "GS")
            {
                errorMessage = "Proszę podać wartość z przedziału 1-3.";
                regex = "^[1-3]{1}$";
            }
            if (SelectedTitle.ShortName == "AMT" && SelectedSection != null && SelectedSection.Name.ToUpper() == "ZOOM")
            {
                errorMessage = "Proszę podać wartość z przedziału 1-5.";
                regex = "^[1-5]{1}$";
            }
            if (SelectedSection != null && (SelectedSection.Name.ToUpper() == "MASTER TRUCK" || SelectedSection.Name.ToUpper() == "AUTOSALON"))
            {
                errorMessage = "Proszę podać wartość z przedziału 1-2.";
                regex = "^[1-2]{1}$";
            }


            if (ValidationHelper.IsTextBoxEmpty(txtHorizontal,
                                                errorMessage,
                                                e,
                                                errorProvider))
                return;

            ValidationHelper.IsTextBoxValid(txtHorizontal,
                                            regex,
                                            errorMessage,
                                            e,
                                            errorProvider);
        }

        //TODO: get the max amount from db
        private void txtVertical_Validating(object sender, CancelEventArgs e)
        {
            Debug.WriteLine(string.Format("Event: {0}", "txtVertical_Validating"));


            string errorMessage = "Proszę podać wartość z przedziału 1-8.";
            string regex = "^[1-8]{1}$";
            if (SelectedTitle.ShortName == "GS")
            {
                errorMessage = "Proszę podać wartość z przedziału 1-4.";
                regex = "^[1-4]{1}$";
            }
            if (SelectedTitle.ShortName == "AMT" && SelectedSection != null && SelectedSection.Name.ToUpper() == "ZOOM")
            {
                errorMessage = "Proszę podać wartość z przedziału 1-6.";
                regex = "^[1-6]{1}$";
            }
            if (SelectedSection != null && (SelectedSection.Name.ToUpper() == "MASTER TRUCK" || SelectedSection.Name.ToUpper() == "AUTOSALON"))
            {
                errorMessage = "Proszę podać wartość z przedziału 1-4.";
                regex = "^[1-4]{1}$";
            }

            if (ValidationHelper.IsTextBoxEmpty(txtVertical, errorMessage, e, errorProvider))
                return;

            ValidationHelper.IsTextBoxValid(txtVertical,
                                            regex,
                                            errorMessage,
                                            e,
                                            errorProvider);
        }

        private void tYTULComboBox_Validating(object sender, CancelEventArgs e)
        {
            ValidationHelper.IsComboValueSelected(tYTULComboBox, -1, "Proszę wybrać tytuł.", e, errProvider);
        }

        private void grzbietComboBox_Validating(object sender, CancelEventArgs e)
        {
            if (grzbietComboBox.Items.Count > 1)
                ValidationHelper.IsComboValueSelected(grzbietComboBox, 0, "Proszę wybrać sekcję.", e, errProvider);
        }

        private void mOD_TYPComboBox_Validating(object sender, CancelEventArgs e)
        {
            if (mOD_TYPComboBox.Items.Count > 1)
                ValidationHelper.IsComboValueSelected(mOD_TYPComboBox, 0, "Proszę wybrać moduł.", e, errProvider);
        }

        private void ogl_dzialComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!obslugaZdarzen) return;

            Debug.WriteLine(string.Format("Event: {0}", "txtVertical_Validating"));

            if ((SelectedNavigationColumn != null) && (SelectedTitle != null))
            {
                NavigationColumnRepository navigationColumnRepository =
                    new NavigationColumnRepository(ConnString.getConnString().Value);
                navigationColumnRepository.FindActiveNavigationSubColumnsByNavigationColumn(SelectedNavigationColumn);
                ComboBoxHelper.Bind(
                    navigationColumnRepository.FindActiveNavigationSubColumnsByNavigationColumn(SelectedNavigationColumn),
                    ogl_rozdzialComboBox,
                    new NavigationSubColumn(0, "-- nieokreślony --"));

                ogl_rozdzialComboBox.DisplayMember = "Name";
                ogl_rozdzialComboBox.ValueMember = "Id";
            }
        }
    }
}