public static void Update(Pitanja question, List<string> tags)
 {
     Connection.dm.fsp_Pitanja_Update(question.PitanjeID, question.Naslov, question.Tekst, question.TemaID, question.KorisnikID, question.DatumIzmjene);
     Connection.dm.SaveChanges();
     Connection.dm.fsp_Pitanja_DeleteTags(question.PitanjeID);
     Connection.dm.SaveChanges();
     foreach (string t in tags)
     {
         try
         {
             Connection.dm.fsp_PitanjaTagovi_Insert(question.PitanjeID, t);
             Connection.dm.SaveChanges();
         }
         catch
         {
         }
     }
 }
 public static void UpdateQuestionLikeStatus(Pitanja pitanje, int userId, bool status)
 {
     if (Connection.dm.PitanjaGlasovi.First(p => p.PitanjeID == pitanje.PitanjeID && p.KorisnikID == userId).Pozitivni != status)
     {
         Connection.dm.PitanjaGlasovi.First(p => p.PitanjeID == pitanje.PitanjeID && p.KorisnikID == userId).Pozitivni = status;
         Connection.dm.SaveChanges();
         if (status)
         {
             pitanje.Pozitivni++;
             pitanje.Negativni--;
             Connection.dm.SaveChanges();
         }
         else
         {
             pitanje.Pozitivni--;
             pitanje.Negativni++;
             Connection.dm.SaveChanges();
         }
     }
 }
        public static void UpdatePitanjeLike(Pitanja pitanje, int korisnikID)
        {
            pitanje.Pozitivni++;

            Connection.dm.SaveChanges();

            PitanjaGlasovi pitanjaG = new PitanjaGlasovi();

            pitanjaG.KorisnikID = korisnikID;
            pitanjaG.Pozitivni = true;
            pitanjaG.Datum = DateTime.Now;
            pitanjaG.PitanjeID = pitanje.PitanjeID;

            Connection.dm.PitanjaGlasovi.Add(pitanjaG);
            Connection.dm.SaveChanges();
        }
 //set broj pregleda ++
 public static void SetBrojPregleda(Pitanja pitanje)
 {
     pitanje.BrojPregleda++;
     Connection.dm.SaveChanges();
 }
        // unos novog pitanja
        public static void savePitanje(Pitanja pitanje, List<string> tagovi)
        {
            Connection.dm.Pitanja.Add(pitanje);
            Connection.dm.SaveChanges();

            foreach (var t in tagovi)
            {
                try
                {
                    Connection.dm.fsp_PitanjaTagovi_Insert(pitanje.PitanjeID, t);
                }
                catch
                {

                }
            }
        }
        public List<Pitanja> ColaborativeFiltering(int ID)
        {
            //sva pitanja za korisnika
            List<PitanjaOcjene> OcijenjenaPitanja = Connection.dm.PitanjaOcjene.Where(x => x.KorisnikID == ID).OrderBy(x => x.PitanjeID).ToList();
            //sva pitanja koja su ocijenjena
            List<int> SvaPitanja = Connection.dm.PitanjaOcjene.OrderBy(x => x.PitanjeID).Select(x => x.PitanjeID).Distinct().ToList();
            //sva pitanja koja korisnik nije ocijenio
            List<int> SvaPitanjaKojaKorisnikNijeOcijenio = new List<int>();
            List<Pitanja> ListaPreporucenihPitanja = new List<Pitanja>();

            foreach (var i in SvaPitanja) // uzimam sva pitanja koje korisnik nije ocijenio
            {
                int brojac = 0;

                foreach (var j in OcijenjenaPitanja)
                {
                    if (i == j.PitanjeID)
                        brojac++;
                }

                if (brojac == 0)
                {
                    SvaPitanjaKojaKorisnikNijeOcijenio.Add(i); // lista tih neocijenjenih pitanja
                }

            }

            List<int> SviKorisniciKojiSuOcijenili = new List<int>(); // lista korisnika koji su ocijenili pitanja koja logovani korisnik nije

            foreach (var i in SvaPitanjaKojaKorisnikNijeOcijenio)
            {
                SviKorisniciKojiSuOcijenili.AddRange(Connection.dm.PitanjaOcjene.Where(x => x.PitanjeID == i).Select(x => x.KorisnikID).ToList());
            }

            foreach (var i in SviKorisniciKojiSuOcijenili) // kroz sve korisnike radi se provjera
            {
                List<PitanjaOcjene> ListaSamoIstihPitanja = new List<PitanjaOcjene>();
                foreach (var item in OcijenjenaPitanja) // ubacujem u listu samo ona pitanja koja logovani korisnik ima radi preporuke
                {
                    PitanjaOcjene p = Connection.dm.PitanjaOcjene.Where(x => x.PitanjeID == item.PitanjeID && x.KorisnikID == i).SingleOrDefault();
                    if (p != null)
                    {
                        ListaSamoIstihPitanja.Add(p);
                    }

                }

                if (ListaSamoIstihPitanja.Count == OcijenjenaPitanja.Count) // poredim samo ista pitanja od korisnika
                {
                    int sumaOcjenaLogovanog = 0;
                    int sumaOcjenaDrugogKorisnika = 0;

                    foreach (var LS in OcijenjenaPitanja) //LS logovani kor, samo da se izračuna suma ocjena
                    {
                        int a = LS.PitanjeID;
                        sumaOcjenaLogovanog += LS.Ocjena;
                    }

                    foreach (var LD in ListaSamoIstihPitanja) //lista drugi korisnik
                    {
                        int a = LD.PitanjeID;
                        sumaOcjenaDrugogKorisnika += LD.Ocjena;
                    }

                    double Ra = (double)sumaOcjenaLogovanog / (double)OcijenjenaPitanja.Count; // prosjek ocjena za logovanog

                    double Rb = (double)sumaOcjenaDrugogKorisnika / (double)ListaSamoIstihPitanja.Count; // prosjek ocjena za logovanog

                    double Brojnik = 0;
                    double Nazivnik = 0;

                    for (int e = 0; e < OcijenjenaPitanja.Count; e++) //// prolazim kroz sve zajednicke elemente i racunam Pearson Correlation
                    {
                        double A = (OcijenjenaPitanja[e].Ocjena - Ra);
                        double B = (ListaSamoIstihPitanja[e].Ocjena - Rb);

                        Brojnik += A * B;

                        double C = Math.Pow(A, 2);
                        double D = Math.Pow(B, 2);

                        Nazivnik += Math.Sqrt(C + D);

                    }

                    double similar = Brojnik / Nazivnik; // ovo je slicnost

                    if (similar > 0.2) /// threshold
                    {
                        //preporucuje korisnika koji je slican

                        List<PitanjaOcjene> SvaPitanjaKorisnikaPoSlicnosti = Connection.dm.PitanjaOcjene.Where(x => x.KorisnikID == i).ToList();

                        foreach (var item in SvaPitanjaKorisnikaPoSlicnosti) // uzimam sva pitanja koje korisnik nije ocijenio
                        {

                            int brojac = 0;

                            foreach (var j in OcijenjenaPitanja)
                            {
                                if (item.PitanjeID == j.PitanjeID)
                                    brojac++;
                            }

                            if (brojac == 0)
                            {
                                Pitanja p = new Pitanja();
                                p = Connection.dm.Pitanja.Where(x => x.PitanjeID == item.PitanjeID).SingleOrDefault();
                                ListaPreporucenihPitanja.Add(p);
                            }

                        }
                    }
                }
            }

            return ListaPreporucenihPitanja;
        }
        protected void Save_Click(object sender, EventArgs e)
        {
            try
            {
                question = new Pitanja();
                question.PitanjeID = Convert.ToInt32(Request["id"]);
                question.Naslov = txtNaslovPitanja.Text;
                question.Tekst = wysiwyg.Text;
                question.KorisnikID = Convert.ToInt32(User.Identity.Name);
                question.DatumIzmjene = DateTime.Now;

                if (ddTema.SelectedIndex != 0)
                    question.TemaID = Convert.ToInt32(ddTema.SelectedValue);
                else
                {
                    error_label.Visible = true;
                    errorLabel.Text = "Obavezno odabrati temu!";
                    return;
                }

                List<string> tags = new List<string>();

                foreach (string tag in tagsInput.Text.Split(','))
                {
                    if (tag.Trim() != "")
                        tags.Add(tag.Trim());
                }

                DAPitanja.Update(question, tags);

                ClearFields();

                successLabel.Text = "Uspješno ste sačuvali izmjene.";
                error_label.Visible = false;
                success_label.Visible = true;

            }
            catch (Exception ex)
            {
                errorLabel.Text = ex.Message;
                if (ex.InnerException != null)
                    errorLabel.Text += "\n" + ex.InnerException;
                error_label.Visible = true;
            }
        }
        private void BindQuestion()
        {
            if (Request["id"] != null)
            {
                questionId = Convert.ToInt32(Request["id"]);
                question = QAService.getPitanjeByID(questionId);
                List<Tagovi> tags = DAPitanja.SelectTags(questionId);

                foreach (Tagovi tag in tags)
                    tagsInput.Text += tag.Naziv + ", ";

                ddTema.SelectedValue = question.TemaID.ToString();
                Teme tema = new Teme();
                if(question.TemaID != null)
                    tema = DATeme.SelectTemaByID((int)question.TemaID);
                if (tema.OblastID != null)
                    ddOblast.SelectedValue = tema.OblastID.ToString();
                txtNaslovPitanja.Text = question.Naslov;
                wysiwyg.Text = question.Tekst;
            }
        }
        protected void Save_Click(object sender, EventArgs e)
        {
            try
            {
                Pitanja pitanje = new Pitanja();
                pitanje.Naslov = txtNaslovPitanja.Text;
                pitanje.Tekst = wysiwyg.Text;
                pitanje.KorisnikID = Convert.ToInt32(User.Identity.Name);
                if (ddTema.SelectedValue == "Odaberite temu")
                {
                    error_label.Visible = true;
                    errorLabel.Text = "Obavezno odabrati temu!";
                    return;
                }
                else
                    pitanje.TemaID = int.Parse(ddTema.SelectedValue);
                pitanje.Pozitivni = 0;
                pitanje.Negativni = 0;
                pitanje.BrojPregleda = 0;
                pitanje.Status = true;
                pitanje.DatumIzmjene = DateTime.Now;
                pitanje.DatumKreiranja = DateTime.Now;

                List<string> tags = new List<string>();

                foreach (string tag in tagsInput.Text.Split(','))
                {
                    if (tag != "")
                        tags.Add(tag.Trim());
                }

                QAService.savePitanje(pitanje, tags);

                ClearFields();

                success_label.Visible = true;
                successLabel.Text = "Uspješno ste dodali pitanje.";
            }
            catch
            {
                error_label.Visible = true;
                errorLabel.Text = "Greška prilikom pohrane podataka!";
                return;

            }
        }