//= = = = = = = = = = = = = = = CONSTRUCTOR (Needs a Question Id parameter) = = = = = = = = = = = = = = = = = = = = = = = = = = = = 
        public QuestionCreateEditViewModel(int qId)
        {

            //Retrieve a full list of all Answer Types
            var all_ans_types = db.OBS_ANS_TYPE.ToList();
            foreach (var ans in all_ans_types) {
                SelectListItem answer_for_dropdown = new SelectListItem() { Text = ans.obs_ans_type_name, Value = ans.obs_ans_type_id.ToString() };
                available_answer_types.Add(answer_for_dropdown);
            }//-------- Finish Retrieving Full List of Answer Types ---------------


            //We will always receive a parameter. Default is zero. Initialize values depending on that parameter
            if (qId < 1) {
                // Set the question default Dates
                questn.obs_question_eff_st_dt = DateTime.Now;
                questn.obs_question_eff_end_dt = Convert.ToDateTime("2060/12/31");

                var mdList = db.OBS_QUESTION_METADATA.ToList();
                foreach (var md in mdList)
                {
                    metaDataTags mdTag = new metaDataTags();
                    mdTag.md_id = md.obs_quest_md_id;
                    mdTag.md_cat = md.obs_quest_md_cat;
                    mdTag.md_value = md.obs_quest_md_value;
                    qUnassignedMD.Add(mdTag);
                    qMDCategories.Add(md.obs_quest_md_cat);
                }
                qMDCategories = qMDCategories.Distinct().ToList().OrderBy(q => q).ToList();
            } //============== END OF INITIALIZATION FOR ZERO ID (NEW) QUESTION =========
            else{
                viewPageTitle = "Question Maintenance";
                //Set the distict list of metadata tags available
                qMDCategories = db.OBS_QUESTION_METADATA.Select(x => x.obs_quest_md_cat).Distinct().OrderBy(y => y).ToList();
                // Retrieve the Question Information from OBS_Question Table
                questn = db.OBS_QUESTION.Find(qId);
                if (questn != null)
                {
                    // Add all Metadata List to the QuestionMD Object
                    var tempMD = from t1 in db.OBS_QUESTION_METADATA
                                 join t2 in db.OBS_QUEST_ASSGND_MD.Where(item => item.obs_question_id == qId && DateTime.Today >= item.obs_qad_eff_st_dt && DateTime.Today < item.obs_qad_eff_end_dt)
                                 on t1.obs_quest_md_id equals t2.obs_quest_md_id into t1Group
                                 from t2 in t1Group.DefaultIfEmpty()
                                 select new
                                 {
                                     md_id = t1.obs_quest_md_id,
                                     mdValue = t1.obs_quest_md_value,
                                     mdCat = t1.obs_quest_md_cat,
                                     mdSelected = ((t2 != null) || (DateTime.Today >= t2.obs_qad_eff_st_dt && DateTime.Today < t2.obs_qad_eff_end_dt) ? true : false)
                                     //xmdSelected = (t1Group == null) ? false : true
                                 };
                    foreach (var mdNew in tempMD)
                    {
                        metaDataTags qMD = new metaDataTags();
                        qMD.md_id = mdNew.md_id;
                        qMD.md_value = mdNew.mdValue;
                        qMD.md_cat = mdNew.mdCat;
                        if (mdNew.mdSelected)
                        {
                            qAssignedMD.Add(qMD);
                            preMetaDataIds.Add(mdNew.md_id);
                        }
                        else
                        {
                            qUnassignedMD.Add(qMD);
                        }
                    }

                    qAssignedMD = qAssignedMD.OrderBy(item => item.md_value).ToList();
                    qUnassignedMD = qUnassignedMD.OrderBy(item => item.md_value).ToList();
                    List<OBS_QUEST_ANS_TYPES> QAInstances = db.OBS_QUEST_ANS_TYPES.Where(x => x.obs_question_id == questn.obs_question_id && (x.obs_qat_end_eff_dt == null || x.obs_qat_end_eff_dt > DateTime.Now)).ToList();
                    if (QAInstances.Count() > 0)  //There were no records found in the 'OBS_QUEST_ANS_TYPES' Table for this question Id
                    {

                        int qatCounter = 0;
                        foreach (OBS_QUEST_ANS_TYPES qaInstanceTemp in QAInstances)
                        {
                            qatCounter++;
                            qatTags temp_qat = new qatTags();
                            temp_qat.QAT = qaInstanceTemp;
                            OBS_ANS_TYPE temp_answer = db.OBS_ANS_TYPE.Single(item => item.obs_ans_type_id == qaInstanceTemp.obs_ans_type_id);
                            temp_qat.answer_type_name = temp_answer.obs_ans_type_name;
                            temp_qat.answer_type_category = temp_answer.obs_ans_type_category;
                            temp_qat.selectable_ans_required = temp_answer.obs_ans_type_has_fxd_ans_yn;
                            temp_qat.uniqueCounter = qatCounter;
                            temp_qat.editable = "false";
                            if (temp_answer.obs_ans_type_has_fxd_ans_yn == "Y")
                            {
                                //if true, we need to list all of them and assign them to object's list of selectable answers
                                List<OBS_QUEST_SLCT_ANS> temp_select_ans = db.OBS_QUEST_SLCT_ANS.Where(item => item.obs_qat_id == qaInstanceTemp.obs_qat_id && item.obs_qsa_eff_st_dt <= DateTime.Now && item.obs_qsa_eff_end_dt > DateTime.Now).OrderBy(x => x.obs_qsa_order).ToList();
                                temp_qat.selAns = temp_select_ans;
                            }
                            int usage_count = db.OBS_COL_FORM_QUESTIONS.Where(x => x.obs_qat_id == qaInstanceTemp.obs_qat_id).Select(y => y.obs_cft_id).Distinct().Count();
                            temp_qat.usageInfo = usage_count > 0 ? "This answer type is on " + usage_count + " form(s)" : String.Empty;
                            questUsedOnForm_Counter = questUsedOnForm_Counter + usage_count;
                            Quest_Assigned_qatTags.Add(temp_qat);
                            if (String.IsNullOrEmpty(usedOnActiveForm))
                            {
                                foreach (int cft in db.OBS_COL_FORM_QUESTIONS.Where(x => x.obs_qat_id == qaInstanceTemp.obs_qat_id).Select(y => y.obs_cft_id).Distinct())
                                {
                                    if (db.OBS_COLLECT_FORM_TMPLT.Single(x => x.obs_cft_id == cft).obs_cft_pub_dtm != null)
                                    {
                                        usedOnActiveForm = "readonly";
                                        formUsageMessage = "This question is on active form";
                                        break;
                                    }
                                    else if (db.OBS_COLLECT_FORM_TMPLT.Single(x => x.obs_cft_id == cft).obs_cft_pub_dtm == null)
                                    {
                                        formUsageMessage = "Warning.  This question is used on saved form";
                                    }                                   
                                }
                            }
                        }
                        Quest_Assigned_qatTags = Quest_Assigned_qatTags.OrderBy(item => item.answer_type_name).ToList();

                        //Loop through the QATtags and set the "Selected" QAT item.
                        foreach (qatTags qatTag in Quest_Assigned_qatTags)
                        {
                            if (db.OBS_COL_FORM_QUESTIONS.Where(item => item.obs_qat_id == qatTag.QAT.obs_qat_id).Count() == 0)
                            {
                                qatTag.editable = "true";
                            }
                        }                
                    }
                }//end of  if (questn != null)
            } //============== END OF INITIALIZATION FOR EXISTING QUESTION =============      
        } //============ END OF CONSTRUCTOR ========================
 public PartialViewResult getQuestionAnswerInfo(qatTags qatInfo)
 {
     return PartialView("_getQuestionAnswerInfo", qatInfo);
 }