public Criterion()
 {
     DataTextField = "ListVal";
     DataValueField = "ID";
     IsHeader = true;
     Object = null;
     Visible = true;
     StandardSelection = new StandardSelections(null, null, null, null, null);
     CurriculumSelection = new CurriculumSelections(null, null, null, null);
     SchoolGradeNameSelection = new SchoolGradeNameSelections(null, null, null, null);
 }
 public Criterion()
 {
     DataTextField = string.Empty;
     DataValueField = string.Empty;
     Key = string.Empty;
     Value = new KeyValuePair(string.Empty, string.Empty);
     Dependencies = new List<KeyValuePair>();
     Header = string.Empty;
     Locked = false;
     // TODO:  MERGE ISSUE
     //UIType = UIType.None;
     HandlerName = string.Empty;
     DefaultValue = null;
     IsUpdatedByUser = false;
     Visible = true;
     AutoHide = true;
     ToValue = new KeyValuePair(string.Empty, string.Empty);
     StandardSelection = new StandardSelections(null, null, null, null, null);
     CurriculumSelection = new CurriculumSelections(null, null, null, null);
     SchoolGradeNameSelection = new SchoolGradeNameSelections(null, null, null, null);
 }
		/// <summary>
		///  SearchResourcesWithCriteria
		/// </summary>
		/// <returns>List</returns>
		public List<Resource> SearchResourcesWithCriteria(bool search = false)
		{
			Criteria criteria = SearchControl.GetCriteria();

			ResourceTypes resUnitType;
			TagCriteriaSelectionParameters tagCriteriaSelectionParameters = new TagCriteriaSelectionParameters();
			string sourceSelection = "";
			string selectedTypes = "";
			string selectedSubTypes = "";
			string textSearch = "";
            List<int> averageRating = new List<int>();
		    DateTime? startExpirationDate = default(DateTime?);
            DateTime? endExpirationDate = default(DateTime?);
			StandardSelections selectedStandards = new StandardSelections();
			StandardSelections selectedAssessed = new StandardSelections();
			StandardSelections selectedTeaches = new StandardSelections();
			StandardSelections selectedRequires = new StandardSelections();
			CurriculumSelections selectedCurriculums = new CurriculumSelections();

            SchoolGradeNameSelections selectedSchoolGradeName = new SchoolGradeNameSelections();

			string selectedMediaType = "";
			string selectedLanguageType = "";

			foreach (Criterion cr in criteria.Criterias)
			{
				switch (cr.Key)
				{
					case "Source":
						sourceSelection = cr.Value.Key;
						break;
					case "Type":
						selectedTypes = cr.Value.Key;
						break;
					case "SubType":
						selectedSubTypes = cr.Value.Key;
						break;
					case "Text":
						textSearch = cr.Value.Value;
						break;
					case "Keywords":
						tagCriteriaSelectionParameters.Keywords = cr.Value.Value;
						break;
					case "Standards":
						selectedStandards.StandardSet = cr.StandardSelection.StandardSet;
						selectedStandards.Grade = cr.StandardSelection.Grade;
						selectedStandards.Subject = cr.StandardSelection.Subject;
						selectedStandards.Course = cr.StandardSelection.Course;
						selectedStandards.Key = cr.Value.Key;
						break;
					case "Curriculum":
						selectedCurriculums.Grade = cr.CurriculumSelection.Grade;
						selectedCurriculums.Subject = cr.CurriculumSelection.Subject;
						selectedCurriculums.Course = cr.CurriculumSelection.Course;
						selectedCurriculums.Key = cr.Value.Key;
						break;
                    case "ExpirationDate":
                        if (cr.Value.Value.IsNotNullOrWhiteSpace())
                        {
                            string[] dateRangeString = cr.Value.Value.Split(':');
                            startExpirationDate = dateRangeString[0].IsNullOrWhiteSpace() ? default(DateTime?) : Convert.ToDateTime(dateRangeString[0]);
                            endExpirationDate = dateRangeString[1].IsNullOrWhiteSpace() ? default(DateTime?) : Convert.ToDateTime(dateRangeString[1]);

                        }
                        break;
                    case "AverageRating":
                        if (cr.Value.Value.IsNotNullOrWhiteSpace())
                        {
                            averageRating = new List<int>(cr.Value.Value.Replace(", ", ",").Split(',').Select(int.Parse));
                        }
                        break;
					case "MediaType":
						if (cr.Value.Value.IsNotNullOrWhiteSpace())
						{
							tagCriteriaSelectionParameters.MediaType =
								new List<int>(cr.Value.Value.Replace(" ", "").Split(',').Select(int.Parse));
                            selectedMediaType =
                                tagCriteriaSelectionParameters.MediaType[0].ToString(CultureInfo.InvariantCulture);
						}
						break;
					case "Language":
						if (cr.Value.Value.IsNotNullOrWhiteSpace())
						{
							selectedLanguageType = cr.Value.Value;
                            tagCriteriaSelectionParameters.Language =
                                (int)Enum.Parse(typeof(LanguageType), cr.Value.Value);
						}
						break;
					case "Grades":
						if (cr.Value.Value.IsNotNullOrWhiteSpace())
                            tagCriteriaSelectionParameters.GradeLevel =
                                new List<string>(cr.Value.Value.Replace(", ", ",").Split(','));
						break;
					case "Assessed":
						selectedAssessed.StandardSet = cr.StandardSelection.StandardSet;
						selectedAssessed.Grade = cr.StandardSelection.Grade;
						selectedAssessed.Subject = cr.StandardSelection.Subject;
						selectedAssessed.Course = cr.StandardSelection.Course;
						selectedAssessed.Key = cr.Value.Key;
						if (IEnumerableExtensions.IsNotNullOrEmpty(GetListOfStandards(selectedAssessed)))
							tagCriteriaSelectionParameters.AssessedStandardIds =
								new List<int>(GetListOfStandards(selectedAssessed).Split(',').Select(int.Parse));
						break;
					case "Teaches":
						selectedTeaches.StandardSet = cr.StandardSelection.StandardSet;
						selectedTeaches.Grade = cr.StandardSelection.Grade;
						selectedTeaches.Subject = cr.StandardSelection.Subject;
						selectedTeaches.Course = cr.StandardSelection.Course;
						selectedTeaches.Key = cr.Value.Key;
						if (IEnumerableExtensions.IsNotNullOrEmpty(GetListOfStandards(selectedTeaches)))
							tagCriteriaSelectionParameters.TeachesStandardIds =
								new List<int>(GetListOfStandards(selectedTeaches).Split(',').Select(int.Parse));
						;
						break;
					case "Requires":
						selectedRequires.StandardSet = cr.StandardSelection.StandardSet;
						selectedRequires.Grade = cr.StandardSelection.Grade;
						selectedRequires.Subject = cr.StandardSelection.Subject;
						selectedRequires.Course = cr.StandardSelection.Course;
						selectedRequires.Key = cr.Value.Key;
						if (IEnumerableExtensions.IsNotNullOrEmpty(GetListOfStandards(selectedRequires)))
							tagCriteriaSelectionParameters.RequiresStandardIds =
								new List<int>(GetListOfStandards(selectedRequires).Split(',').Select(int.Parse));
						;
						break;
					case "TextComplexity":
						tagCriteriaSelectionParameters.TextComplexity = cr.Value.Value;
						break;
					case "ReadingLevel":
						tagCriteriaSelectionParameters.ReadingLevel = cr.Value.Value;
						break;
					case "EducationalSubject":
						if (cr.Value.Key.IsNotNullOrWhiteSpace())
                            tagCriteriaSelectionParameters.EducationalSubject =
                                new List<string>(cr.Value.Value.Replace(", ", ",").Split(','));
						break;

					case "InteractivityType":
						if (cr.Value.Value.IsNotNullOrWhiteSpace())
							tagCriteriaSelectionParameters.InteractivityType =
								new List<int>(cr.Value.Value.Replace(" ", "").Split(',').Select(int.Parse));

						if (sourceSelection == NationalLearningRegistry)
						{
							tagCriteriaSelectionParameters.InteractivityTypes = new List<string>();
                            DataTable dtActivity =
                                Base.Classes.Assessment.LoadLrmiTagsByLookupEnum((int)Enums.LrmiTags.Activity,
                                    Enums.SelectionType.Assessment.ToString());
						
							List<KeyValuePair<string, string>> theList = new List<KeyValuePair<string, string>>();
							foreach (DataRow row in dtActivity.Rows)
							{
                                theList.Add(new KeyValuePair<string, string>(row["ID"].ToString(),
                                    row["Description"].ToString()));
							}

							foreach (int item in tagCriteriaSelectionParameters.InteractivityType)
							{
                                tagCriteriaSelectionParameters.InteractivityTypes.Add(
                                    theList.First(kvp => kvp.Key == item.ToString()).Value);
							}
						}
						break;

					case "LearningResource":
						if (cr.Value.Value.IsNotNullOrWhiteSpace())
							tagCriteriaSelectionParameters.LearningResourceType =
								new List<int>(cr.Value.Value.Replace(" ", "").Split(',').Select(int.Parse));
						break;
					case "EducationalUse":
						if (cr.Value.Value.IsNotNullOrWhiteSpace())
							tagCriteriaSelectionParameters.EducationalUse =
								new List<int>(cr.Value.Value.Replace(" ", "").Split(',').Select(int.Parse));

						if (sourceSelection == NationalLearningRegistry)
						{
							tagCriteriaSelectionParameters.EducationalUses = new List<string>();
                            DataTable dtEducationalSubjects =
                                Base.Classes.Assessment.LoadLrmiTagsByLookupEnum((int)Enums.LrmiTags.EducationalUse,
                                    Enums.SelectionType.Resource.ToString());

							List<KeyValuePair<string, string>> theList = new List<KeyValuePair<string, string>>();
							foreach (DataRow row in dtEducationalSubjects.Rows)
							{
                                theList.Add(new KeyValuePair<string, string>(row["ID"].ToString(),
                                    row["Description"].ToString()));
							}

							foreach (int item in tagCriteriaSelectionParameters.EducationalUse)
							{
                                tagCriteriaSelectionParameters.EducationalUses.Add(
                                    theList.First(kvp => kvp.Key == item.ToString()).Value);
							}
						}
						break;
					case "EndUser":
						if (cr.Value.Value.IsNotNullOrWhiteSpace())
							tagCriteriaSelectionParameters.EndUser =
								new List<int>(cr.Value.Value.Replace(" ", "").Split(',').Select(int.Parse));

						if (sourceSelection == NationalLearningRegistry)
						{
							tagCriteriaSelectionParameters.EndUsers = new List<string>();
                            DataTable dtEndUsers =
                                Base.Classes.Assessment.LoadLrmiTagsByLookupEnum((int)Enums.LrmiTags.EndUser,
                                    Enums.SelectionType.Resource.ToString());

							List<KeyValuePair<string, string>> theList = new List<KeyValuePair<string, string>>();
							foreach (DataRow row in dtEndUsers.Rows)
							{
                                theList.Add(new KeyValuePair<string, string>(row["ID"].ToString(),
                                    row["Description"].ToString()));
							}

							foreach (int item in tagCriteriaSelectionParameters.EndUser)
							{
                                tagCriteriaSelectionParameters.EndUsers.Add(
                                    theList.First(kvp => kvp.Key == item.ToString()).Value);
							}
						}

						break;
					case "Duration":
						if (cr.Value.Value.IsNotNullOrWhiteSpace())
						{
							string[] durationStrings = cr.Value.Value.Split(':');
							tagCriteriaSelectionParameters.TimeRequiredDays = Convert.ToInt32(durationStrings[0]);
							tagCriteriaSelectionParameters.TimeRequiredHours = Convert.ToInt32(durationStrings[1]);
							tagCriteriaSelectionParameters.TimeRequiredMinutes = Convert.ToInt32(durationStrings[2]);
						}
						break;
					case "AgeAppropriate":
						if (cr.Value.Value.IsNotNullOrWhiteSpace())
						{
							if (sourceSelection == NationalLearningRegistry)
							{
								string validAges = mapAgeAppropriateToAges(cr.Value.Value);
								if (!string.IsNullOrEmpty(validAges))
								{
									tagCriteriaSelectionParameters.Ages = validAges;
								}
								//cant convert a string like "16-18" to an int
								// this needs to be looked at...
								//tagCriteriaSelectionParameters.AgeAppropriate = Convert.ToInt32(cr.Value.Value);
							}
						}
						break;
					case "Creator":
						tagCriteriaSelectionParameters.Creator = cr.Value.Value;
						break;
					case "Publisher":
						tagCriteriaSelectionParameters.Publisher = cr.Value.Value;
						break;
					case "UsageRights":
						if (cr.Value.Value.IsNotNullOrWhiteSpace())
						{
							tagCriteriaSelectionParameters.UseRightUrl = Convert.ToInt32(cr.Value.Key);

							if (sourceSelection == NationalLearningRegistry)
							{
                                string theURLResult =
                                    GetCreativeCommonsUrls().First(kvp => kvp.Key == cr.Value.Key).Value;

								if (cr.Value.Value.Equals("Custom", StringComparison.OrdinalIgnoreCase))
								{
									theURLResult = cr.Value.Value;
								}

								if (!string.IsNullOrEmpty(theURLResult))
								{
									//TODO: match theURLResult to LRMI tag dropdown items
									tagCriteriaSelectionParameters.UseRightUrlTxt = theURLResult;
									//If no match then set to "CUSTOM" I guess
								}
							}
						}
						break;
                    case "SchoolGradeName":
                        selectedSchoolGradeName.School = cr.SchoolGradeNameSelection.School;
                        selectedSchoolGradeName.Grade = cr.SchoolGradeNameSelection.Grade;
                        selectedSchoolGradeName.Name = cr.SchoolGradeNameSelection.Name; // userid
                        selectedSchoolGradeName.Key = cr.SchoolGradeNameSelection.Key;
                        break;


				}
			}

			string whereclause = "";
			string whereClauseIp = "";
			string whereClauseUp = "";
			string whereClauseLp = "";
			string whereClauseMu = "";
			string whereTextSearch = "";

			List<Resource> resultResource = new List<Resource>();

			if (sourceSelection == "" ||
				sourceSelection == District ||
				sourceSelection == State ||
				sourceSelection == MyDocuments ||
                sourceSelection == InternalSource ||
                sourceSelection == TeacherMyDocs ||
                sourceSelection == SharedDocument)//US15667
			{

				resUnitType = ResourceTypes.All;

				switch (sourceSelection)
				{
					case District:
						resUnitType = ResourceTypes.DistrictDocuments;
						break;
					case State:
						resUnitType = ResourceTypes.StateDocuments;
						break;
					case MyDocuments:
						resUnitType = ResourceTypes.MyDocuments;
						break;
                    case TeacherMyDocs: 
                        resUnitType = ResourceTypes.MyDocuments;
                        break;
                    case SharedDocument:
                        resUnitType = ResourceTypes.SharedDocuments;
                        break;
				}

				if (selectedTypes != null && (selectedTypes.Any() && selectedTypes != ""))
				{
					whereClauseIp = " Type = " + selectedTypes;
					whereClauseLp = " Type = " + selectedTypes;
					whereClauseMu = " Type = " + selectedTypes;
					if (selectedTypes == ((int)LookupDetail.CurriculumUnitMA).ToString(CultureInfo.InvariantCulture))
					{
						whereClauseUp = " Type = " + ((int)LookupDetail.UnitPlan) + " OR Type = " +
										((int)LookupDetail.CurriculumUnitMA);
						resUnitType = ResourceTypes.StateDocuments;
					}
					else
					{
						whereClauseUp = " Type = " + selectedTypes;
					}
					whereclause += whereclause == ""
						? " TYPE in ( " + string.Join(",", selectedTypes.Split(',')) +
						  ") "
						: "AND" + " TYPE in ( " +
						  string.Join(",", selectedTypes.Split(',')) + ") ";
				}
				if (selectedSubTypes.Any() && selectedSubTypes != "")
				{
					whereClauseIp += whereClauseIp == ""
						? " SubType = " + selectedSubTypes
						: " AND" + " SubType = " + selectedSubTypes;
					whereClauseLp += whereClauseLp == ""
						? " SubType = " + selectedSubTypes
						: " AND" + " SubType = " + selectedSubTypes;
					whereClauseMu += whereClauseMu == ""
						? " SubType = " + selectedSubTypes
						: " AND" + " SubType = " + selectedSubTypes;

					if (selectedSubTypes ==
						((int)LookupDetail.StateModelCurriculumUnitForm).ToString(CultureInfo.InvariantCulture))
					{
						whereClauseUp += whereClauseUp == ""
							? " SubType = " + ((int)LookupDetail.UnitPlanForm) + " OR SubType= " +
							  ((int)LookupDetail.StateModelCurriculumUnitForm)
							: " AND" + " SubType = " + ((int)LookupDetail.UnitPlanForm) + " OR SubType= " +
							  ((int)LookupDetail.StateModelCurriculumUnitForm);
						resUnitType = ResourceTypes.StateDocuments;
					}
					else
					{
						whereClauseUp += whereClauseUp == ""
							? " SubType = " + selectedSubTypes
							: " AND" + " SubType = " + selectedSubTypes;
					}
					whereclause += whereclause == ""
						? " SUBTYPE in ( " +
						  string.Join(",", selectedSubTypes.Split(',')) + ")"
						: "AND" + " SUBTYPE in ( " +
						  string.Join(",", selectedSubTypes.Split(',')) + ")";
				}
				if (textSearch.Any() && textSearch.Trim() != "")
				{
					whereclause += whereclause == ""
						? " Name like ( '%" + textSearch.Trim() + "%')"
						: " AND" + " Name like ( '%" + textSearch.Trim() + "%')";
					whereTextSearch = " like ( '%" + textSearch.Trim() + "%')";
				}

				DistrictParms districtParms = DistrictParms.LoadDistrictParms();
				string envState = KenticoHelper.GetKenticoMainFolderName(districtParms.ClientID);
				_districts = new System.Text.StringBuilder();
				_stateDocuments = new System.Text.StringBuilder();
                //US15667
                _sharedDocuments = new System.Text.StringBuilder();
				_districts.Append("/" + envState + "/Districts/");
				_stateDocuments.Append("/" + envState + "/Documents/");
                //US15667
                _sharedDocuments.Append("/" + envState + "/Shared/");

                UserInfo ui = new UserInfo();
                if (!string.IsNullOrEmpty(selectedSchoolGradeName.Name))
                {
                    if ((bool)Session["KenticoEnabled"])
                    {
                        KenticoHelper.KenticoUserName = KenticoHelper.GetKenticoUser(selectedSchoolGradeName.Name);
                        ui = CMS.SiteProvider.UserInfoProvider.GetFullUserInfo(KenticoHelper.KenticoUserName);
                }
                    else
                    { ui = (UserInfo)Session["KenticoUserInfo"]; }
                }
                else
                { ui = (UserInfo)Session["KenticoUserInfo"]; }


				string where = whereclause;
				const string orderBy = "Name";

				TreeProvider treeProvider =
					KenticoHelper.GetUserTreeProvider(_sessionObject.LoggedInUser.ToString());
				DataSet resourceDs = KenticoHelper.ExpandedSearchDocumentType(ui, ResourceClassName,
					treeProvider, resUnitType, where, orderBy, filterUsageRightExpiredContent);

				List<Resource> lstResource = new List<Resource>();
                List<Resource> listResourceTemp = new List<Resource>();

				DataSet lookupDataSet = new DataSet();
				DataClassInfo customTable = DataClassInfoProvider.GetDataClass("TG.LookupDetails");
				if (customTable != null)
				{
					lookupDataSet = (new CustomTableItemProvider(ui)).GetItems("TG.LookupDetails",
						string.Empty, string.Empty);
				}

				//For IP, UP, LP, and MU
				List<Resource> lstIpup = GetPlans(ui, treeProvider, whereClauseIp, whereClauseUp, whereClauseLp,
					whereClauseMu, whereTextSearch, lookupDataSet, districtParms, resUnitType);



				if (!string.IsNullOrWhiteSpace(selectedStandards.StandardSet) ||
					!string.IsNullOrWhiteSpace(selectedCurriculums.Grade))
				{
					if (!string.IsNullOrWhiteSpace(selectedStandards.StandardSet))
					{

						string stringListOfStandards = GetListOfStandards(selectedStandards);
						List<CmsCustomTable> lstStandards = GetDocToStandardsFromCms(ui,
							stringListOfStandards);

						if (lstStandards != null && lstStandards.Count > 0)
						{
							if (resourceDs != null && resourceDs.Tables[0].Rows.Count > 0)
							{
					            listResourceTemp = (from res in resourceDs.Tables[0].AsEnumerable()
											   join ctdtl in lookupDataSet.Tables[0].AsEnumerable() on
												   Convert.ToInt32(res["type"].ToString()) equals
												   Convert.ToInt32(ctdtl["enum"].ToString())
											   join stdtl in lookupDataSet.Tables[0].AsEnumerable() on
												   Convert.ToInt32(res["subtype"].ToString()) equals
												   Convert.ToInt32(stdtl["enum"].ToString())
					                                join s in lstStandards on
					                                    Convert.ToInt32(res["DocumentNodeID"]) equals s.DocId
											   select
												   new Resource
												   {
													   Source =
                                                res["NodeAliasPath"].ToString()
					                                                                .IndexOf(
					                                                                    _districts.ToString(),
					                                                                    StringComparison.Ordinal)
					                                            >= 0
															   ? District
                                                    : res["NodeAliasPath"].ToString()
					                                                                      .IndexOf(
					                                                                          _stateDocuments
					                                            .ToString(),
					                                                                          StringComparison
					                                            .Ordinal) >=
                                                      0
																   ? State
                                                    : res["NodeAliasPath"].ToString()
                                                        .IndexOf(_sharedDocuments.ToString(), StringComparison.Ordinal) >=
                                                      0
                                                                   ? SharedDocument //US15667
																   : MyDocuments,
													   ID = Convert.ToInt32(res["DocumentID"]),
													   DocumentNodeID = Convert.ToInt32(res["DocumentNodeID"]),
													   DocumentForeignKeyValue =
					                                            Convert.ToInt32(
					                                                res["DocumentForeignKeyValue"].ToString()),
													   DocumentType = res["ClassName"].ToString(),
													   ID_Encrypted = "",
													   NodeAliasPath = res["NodeAliasPath"].ToString(),
													   ResourceName = res["Name"].ToString(),
													   Description = res["Description"].ToString(),
													   Type = ctdtl["Description"].ToString(),
													   Subtype = stdtl["Description"].ToString(),
													   ViewLink =
					                                            string.IsNullOrEmpty(
					                                                res["AttachmentName"].ToString())
															   ? ""
															   : res["AttachmentName"].ToString(),
					                                        ExpirationDate =
					                                            res["ExpirationDate"] == DBNull.Value
					                                                ? default(DateTime)
					                                                : Convert.ToDateTime(res["ExpirationDate"]),
					                                        AverageRating =
					                                            res["AverageRating"] == DBNull.Value
					                                                ? default(decimal)
                                                                    : Convert.ToDecimal(res["AverageRating"]),
                                                                    DocumentCreatedWhen= res["DocumentModifiedWhen"] == DBNull.Value
                                                            ? default(DateTime)
                                                            : Convert.ToDateTime(res["DocumentModifiedWhen"])
												   }).Distinct().ToList<Resource>();
							}

						lstIpup = (from res in lstIpup
										   join s in lstStandards on res.DocumentNodeID equals s.DocId
										   select res).ToList<Resource>();
							
					        if (lstResource.Count > 0 || isFilteredResourceEmpty)
					            lstResource = (from res in lstResource
					                           join t in listResourceTemp on res.ID equals t.ID
					                           select res).ToList<Resource>();
					        else
					            lstResource.AddRange(listResourceTemp);

					        if (listResourceTemp.Count == 0)
					            isFilteredResourceEmpty = true;
						}
                        else
					    {
                            lstIpup = new List<Resource>();
					        lstResource = new List<Resource>();
					    }

					}

					if (!string.IsNullOrWhiteSpace(selectedCurriculums.Grade))
					{

						List<CmsCustomTable> lstCurriculum = GetDocToCurucullumsFromCms(ui);
						List<object> listCurriculums = GetCurriculumsIDsFromSelectedCriteria(selectedCurriculums);
						lstCurriculum = lstCurriculum.FindAll(f => listCurriculums.Contains(f.Id));
                        if (lstCurriculum.Count > 0)
                        {
						if (resourceDs != null && resourceDs.Tables[0].Rows.Count > 0)
						{
					            listResourceTemp = (from res in resourceDs.Tables[0].AsEnumerable()
										   join ctdtl in lookupDataSet.Tables[0].AsEnumerable() on
											   Convert.ToInt32(res["type"].ToString()) equals
											   Convert.ToInt32(ctdtl["enum"].ToString())
										   join stdtl in lookupDataSet.Tables[0].AsEnumerable() on
											   Convert.ToInt32(res["subtype"].ToString()) equals
											   Convert.ToInt32(stdtl["enum"].ToString())
					                                join s in lstCurriculum on
					                                    Convert.ToInt32(res["DocumentNodeID"]) equals s.DocId
										   select
											   new Resource
											   {
												   Source =
                                            res["NodeAliasPath"].ToString()
					                                                                .IndexOf(
					                                                                    _districts.ToString(),
					                                                                    StringComparison.Ordinal)
					                                            >= 0
														   ? District
                                                : res["NodeAliasPath"].ToString()
					                                                                      .IndexOf(
					                                                                          _stateDocuments
					                                            .ToString(),
					                                                                          StringComparison
					                                            .Ordinal) >= 0
															   ? State
                                                : res["NodeAliasPath"].ToString()
                                                    .IndexOf(_sharedDocuments.ToString(), StringComparison.Ordinal) >= 0
                                                               ? SharedDocument//US15667
															   : MyDocuments,
												   ID = Convert.ToInt32(res["DocumentID"]),
												   DocumentNodeID = Convert.ToInt32(res["DocumentNodeID"]),
												   DocumentForeignKeyValue =
					                                            Convert.ToInt32(
					                                                res["DocumentForeignKeyValue"].ToString()),
												   DocumentType = res["ClassName"].ToString(),
												   ID_Encrypted = "",
												   NodeAliasPath = res["NodeAliasPath"].ToString(),
												   ResourceName = res["Name"].ToString(),
												   Description = res["Description"].ToString(),
												   Type = ctdtl["Description"].ToString(),
												   Subtype = stdtl["Description"].ToString(),
												   ViewLink =
					                                            string.IsNullOrEmpty(
					                                                res["AttachmentName"].ToString())
														   ? ""
														   : res["AttachmentName"].ToString(),
					                                        ExpirationDate =
					                                            res["ExpirationDate"] == DBNull.Value
					                                                ? default(DateTime)
					                                                : Convert.ToDateTime(res["ExpirationDate"]),
					                                        AverageRating =
					                                            res["AverageRating"] == DBNull.Value
					                                                ? default(decimal)
                                                                    : Convert.ToDecimal(res["AverageRating"]),
                                                            DocumentCreatedWhen= res["DocumentModifiedWhen"] == DBNull.Value
                                                                   ? default(DateTime)
                                                                   : Convert.ToDateTime(res["DocumentModifiedWhen"])
												  
											   }).ToList<Resource>();
						}

						
							lstIpup = (from res in lstIpup
									   join s in lstCurriculum on res.DocumentNodeID equals s.DocId
									   select res).ToList<Resource>();

					        if (lstResource.Count > 0  || isFilteredResourceEmpty)
					            lstResource = (from res in lstResource
					                           join t in listResourceTemp on res.ID equals t.ID
					                           select res).ToList<Resource>();
					        else
					            lstResource.AddRange(listResourceTemp);

					        if (listResourceTemp.Count == 0)
					            isFilteredResourceEmpty = true;
						}
                        else
					    {
                            lstIpup = new List<Resource>();
					        lstResource = new List<Resource>();
					    }
					}

				}
				else
				{

					if (resourceDs != null && resourceDs.Tables[0].Rows.Count > 0)
					{

						listResourceTemp = (from res in resourceDs.Tables[0].AsEnumerable()
									   join ctdtl in lookupDataSet.Tables[0].AsEnumerable() on
										   Convert.ToInt32(res["type"].ToString()) equals Convert.ToInt32(ctdtl["enum"].ToString())
									   join stdtl in lookupDataSet.Tables[0].AsEnumerable() on
										   Convert.ToInt32(res["subtype"].ToString()) equals
										   Convert.ToInt32(stdtl["enum"].ToString())
									   select
										   new Resource
										   {
											   Source =
                                        res["NodeAliasPath"].ToString()
                                            .IndexOf(_districts.ToString(), StringComparison.Ordinal) >= 0
													   ? District
                                            : res["NodeAliasPath"].ToString()
                                                .IndexOf(_stateDocuments.ToString(), StringComparison.Ordinal) >= 0
														   ? State
                                            : res["NodeAliasPath"].ToString()
                                                .IndexOf(_sharedDocuments.ToString(), StringComparison.Ordinal) >= 0
                                                           ? SharedDocument //US15667
														   : MyDocuments,
											   ID = Convert.ToInt32(res["DocumentID"]),
											   DocumentForeignKeyValue = Convert.ToInt32(res["DocumentForeignKeyValue"].ToString()),
											   DocumentType = res["ClassName"].ToString(),
											   ID_Encrypted = "",
											   NodeAliasPath = res["NodeAliasPath"].ToString(),
											   ResourceName = res["Name"].ToString(),
											   Description = res["Description"].ToString(),
											   Type = ctdtl["Description"].ToString(),
											   Subtype = stdtl["Description"].ToString(),
											   ViewLink =
												   string.IsNullOrEmpty(res["AttachmentName"].ToString())
													   ? ""
													   : res["AttachmentName"].ToString(),
											   DocumentNodeID = Convert.ToInt32(res["DocumentNodeID"]),
                                               ExpirationDate = res["ExpirationDate"] == DBNull.Value ? default(DateTime) : Convert.ToDateTime(res["ExpirationDate"]),
                                                    AverageRating = res["AverageRating"] == DBNull.Value ? default(decimal) : Convert.ToDecimal(res["AverageRating"]),
                                                    DocumentCreatedWhen= res["DocumentModifiedWhen"] == DBNull.Value? default(DateTime): Convert.ToDateTime(res["DocumentModifiedWhen"])												  
										   }).ToList<Resource>();
					}

                    if (lstResource.Count > 0  || isFilteredResourceEmpty )
                        lstResource = (from res in lstResource
                                       join t in listResourceTemp on res.ID equals t.ID
                                       select res).ToList<Resource>();
                    else
                        lstResource.AddRange(listResourceTemp);

                    

				}

				if (lstIpup.Count > 0)
				{
					lstResource.AddRange(lstIpup);
				}

				string hostURL = Request.Url.ToString();
				try
				{
					int hostPosition = hostURL.LastIndexOf(districtParms.ClientID) - 1;
					hostURL = hostURL.Substring(0, hostPosition);
				}
				catch
				{
					hostURL = "";
				}

			   if (startExpirationDate != default(DateTime?))
                {
                    lstResource = lstResource.FindAll(unl => unl.ExpirationDate >= startExpirationDate && unl.ExpirationDate != default(DateTime));
                }

                if (endExpirationDate != default(DateTime?))
                {
                    lstResource = lstResource.FindAll(unl => unl.ExpirationDate <= endExpirationDate && unl.ExpirationDate != default(DateTime));
                }

			    if (averageRating.Count > 0)
			    {
			        List<RatingRange> ratingRange = _reviewFacade.GetRatingFilterForItemSearch().ToList();
                    List<Resource> newLstResource = new List<Resource>();
			        decimal maxvalue;
			        decimal minvalue;
			        foreach (var id in averageRating )
			        {
			            maxvalue = ratingRange.Find(x => x.Id == id).EndValue;
                        minvalue = ratingRange.Find(x => x.Id == id).StartValue;
			            newLstResource.AddRange(
			                lstResource.FindAll(
			                    unl => unl.AverageRating >= minvalue && unl.AverageRating <= maxvalue).ToList());

			        }
			        lstResource = newLstResource;
			    }

			    resultResource =
					lstResource.GroupBy(
						x =>
							new
							{
								x.Source,
								x.ID,
								x.DocumentNodeID,
								x.ResourceName,
                                x.ResourceNameReadOnly,
								x.Description,
								x.Type,
								x.Subtype,
								x.ViewLink,
								x.NodeAliasPath,
								x.DocumentForeignKeyValue,
								x.DocumentType,
                                x.ExpirationDate,
                                x.AverageRating,
                                x.DocumentCreatedWhen
							})
						.Select(r => new Resource
						{
							Source = r.Key.Source,
							ID = r.Key.ID,
							DocumentNodeID = r.Key.DocumentNodeID,
							ResourceName = r.Key.ResourceName,
                            ResourceNameReadOnly = r.Key.ResourceName,
							Description = r.Key.Description,
							Type = r.Key.Type,
							Subtype = r.Key.Subtype,
							//ViewLink = string.IsNullOrWhiteSpace(r.Key.ViewLink) ? "" : hostURL + KenticoHelper.KenticoVirtualFolderRelative + "/cmspages/getfile.aspx?guid=" + r.Key.ViewLink + "&disposition=inline",
							ViewLink =
								string.IsNullOrWhiteSpace(r.Key.ViewLink)
									? ""
                                    : KenticoHelper.KenticoVirtualFolderRelative + "/cmspages/getfile.aspx?guid=" +
                                      r.Key.ViewLink +
									  "&disposition=inline",
							NodeAliasPath = r.Key.NodeAliasPath,
							DocumentForeignKeyValue = r.Key.DocumentForeignKeyValue,
							DocumentType = r.Key.DocumentType,
                            ExpirationDate = r.Key.ExpirationDate,
                            AverageRating = r.Key.AverageRating,
                            DocumentCreatedWhen=r.Key.DocumentCreatedWhen
						}).ToList();

                resultResource = resultResource.OrderByDescending(rslRsc => rslRsc.DocumentCreatedWhen).ToList();

				if (tagCriteriaSelectionParameters != null)
				{
					if (!TagCriteriaSelectionParameters.IsEmpty(tagCriteriaSelectionParameters))
					{
						List<Resource> filteredByTags = FilterResourcesByTags(resultResource,
							tagCriteriaSelectionParameters);
						resultResource = filteredByTags;
					}
				}
			}
			else
			{
				string resourceTextSearch = textSearch.Trim() == ""
					? LearningMediaFacets.SearchTermAll
					: textSearch.Trim();

				if (sourceSelection == NationalLearningRegistry)
				{
                    NLRSearchParameters nlrSearchParameters = getNLRSearchParameters(resourceTextSearch,
                        tagCriteriaSelectionParameters);
					resultResource = GetLearningRegistryResources(search, nlrSearchParameters);
				}

				if (sourceSelection == PBSLearningMedia)
				{
					if (tagCriteriaSelectionParameters.GradeLevel == null)
						tagCriteriaSelectionParameters.GradeLevel = new List<string>();
                    resultResource = GetWgbhResources(search, tagCriteriaSelectionParameters.GradeLevel,
                        resourceTextSearch,
						selectedMediaType, selectedLanguageType);
				}
			}
			return resultResource;
		}
		/// <summary>
		/// GetListOfStandards - Get string back of standard Id's to be used as a list.
		/// </summary>
		/// <param name="selectedStandards"></param>
		/// <returns>string</returns>
		private string GetListOfStandards(StandardSelections selectedStandards)
		{
			string stringListOfStandards = selectedStandards.Key;

			if (!stringListOfStandards.IsInt() && !string.IsNullOrEmpty(selectedStandards.StandardSet))
			{
				var standardSetList = new drGeneric_String();
				if (!String.IsNullOrEmpty(selectedStandards.StandardSet))
				{
					standardSetList.Add(selectedStandards.StandardSet.Trim());
				}


				var gradeList = new drGeneric_String();
				if (!String.IsNullOrEmpty(selectedStandards.Grade))
				{
					gradeList.Add(selectedStandards.Grade.Trim());
				}

				var subjectList = new drGeneric_String();
				if (!String.IsNullOrEmpty(selectedStandards.Subject))
				{
					subjectList.Add(selectedStandards.Subject.Trim());
				}

				var courseList = new drGeneric_String();
				if (!String.IsNullOrEmpty(selectedStandards.Course))
				{
					courseList.Add(selectedStandards.Course.Trim());
				}
				DataTable filteredStandards = Base.Classes.Standards.SearchStandards(false,
					"", //TextSearch
					"", //TextSearchVal
					null, //itemBanks
					null, //StandardCourses
					null,
					standardSetList.Count > 0 ? standardSetList : null,
					gradeList.Count > 0 ? gradeList : null,
					subjectList.Count > 0 ? subjectList : null,
					courseList.Count > 0 ? courseList : null);
				List<object> listOfStandards = (from lststd in filteredStandards.DataSet.Tables[0].AsEnumerable()
												select lststd["StandardID"]).ToList();
				stringListOfStandards = string.Join(",", listOfStandards);
				if (stringListOfStandards == "") stringListOfStandards = "0";
			}
			return stringListOfStandards;
		}