var SearchData = {
returnAll : false,
grades : [],
keywords : [],
types : [],
regions: [],
levels: [],
topics : [],
searchString : "",
resultData : { items : []},
allResources : [],
/*old*/
pages : [],
currentPageIndex : 0,
totalResults : 0,
resultsPerPage : 12,
storedSearch : null,
active : false,
currentAlignment : null,
queryData : function() {
if (window.location.href.indexOf("search") < 0)
return;
//Grab the URL variable and add it to the form, but maybe put it in the page instead
SearchData.searchString = (GET ? decodeURIComponent(GET.search_text) : "");
SearchData.searchString = (SearchData.searchString == 'undefined' ? "" : SearchData.searchString);
$("#form_header_text").find("input")[0].value = SearchData.searchString;
$.ajax({
type: "GET",
url: "bin/QueryMPTLiteResources.php",
//datatype: "json",
success: function(db_data) {
//Clear results
var returnDB_data = jQuery.parseJSON(db_data);
SearchData.allResources = returnDB_data;
SearchData.resultData = { items : []};
SearchData.doTheSearch(true);
}
});
},
storeTextSearch: function (event) {
event = $.event.fix(event);
event.preventDefault();
event.stopPropagation();
var search_text = $("#form_header_text").find("input")[0].value;
var windowURL = window.location.href.substring(0, window.location.href.lastIndexOf('/'));
if (windowURL.indexOf("/search") > -1)
windowURL = windowURL + "/search_results.html?search_text=" + encodeURIComponent(search_text);
else if (windowURL.indexOf("/tps") > -1)
windowURL = windowURL.substring(0, windowURL.indexOf("/tps")) + "/search/search_results.html?search_text=" + encodeURIComponent(search_text);
else if (windowURL.indexOf("/medialiteracy") > -1)
windowURL = windowURL.substring(0, windowURL.indexOf("/medialiteracy")) + "/search/search_results.html?search_text=" + encodeURIComponent(search_text);
else
windowURL = windowURL + "/search/search_results.html?search_text=" + encodeURIComponent(search_text);
window.location.href = windowURL;
},
parseQuery:function()
{
this.currentPageIndex = 0;
this.pages = [[]];
$(this.resultData.items).each(this.parseRecord);
this.totalResults = (this.pages.length - 1) * this.resultsPerPage + this.pages[this.pages.length-1].length;
$("#resource-results-container").html(this.pages[0].join(" "));
$(".resource-result").css("opacity",0);
$(".resource-summary").html("Showing "+(this.totalResults ? 1 : 0)+"-" + Math.min(this.pages[0].length,this.totalResults) + " of " + this.totalResults + " results");
$(".resource-result").each(function (index){$(this).delay(index*75).animate({opacity:1,duration:1000})})
},
// a bit of redundancy so that we don't have to reload all resources
filterResults: function()
{
//Hide the results momentarily
$('#resultsData').addClass("loading").removeClass("loaded");
//SearchData.resultData = { items : []};
//NEW
var atLeastOneSelected = false;
SearchData.types=[];
$("#resource-filter-type").find("input:checked").each(function() {
SearchData.types.push(this.value);
atLeastOneSelected = true;
});
SearchData.topics = [];
$("#resource-filter-topic").find("input:checked").each(function() {
SearchData.topics.push(this.value);
atLeastOneSelected = true;
});
SearchData.grades = [];
$("#resource-filter-level").find("input:checked").each(function() {
SearchData.grades.push(this.value);
atLeastOneSelected = true;
});
SearchData.doTheSearch(false, atLeastOneSelected);
},
displayFilteredResults: function() {
$('#resultsData').html(" ");
var filterHtml = ''+$(SearchData.resultData.items).length+''+' results for: "' + SearchData.searchString + '" ';
var firstOne = true;
$("#resource-filter-type").find("input:checked").each(function() {
if (firstOne)
{
firstOne = false;
}
else
filterHtml += ', ';
filterHtml += '' + $(this).closest('label').text() +' ';
});
$("#resource-filter-topic").find("input:checked").each(function() {
if (firstOne)
{
firstOne = false;
}
else
filterHtml += ', ';
filterHtml += '' + $(this).closest('label').text() +' ';
});
$("#resource-filter-level").find("input:checked").each(function() {
//console.log("label:",$(this.closest('label')).text(), this, this.value);
if (firstOne)
{
firstOne = false;
}
else
filterHtml += ', ';
filterHtml += '' + $(this).closest('label').text() +' ';
});
if ($(SearchData.resultData.items).length == 0)
{
if ($('#resultsData').hasClass("loading"))
$('#resultsData').addClass("loaded").removeClass('loading');
$('
').html('Thinkport does not have resources to meet your search criteria.
Please refine your Thinkport search with the filters on the left,
or search PBS LearningMedia to access additional learning resources.
Have a question? We can help find the answer! Contact Us here.').appendTo('#resultsData');
}
else
{
$('').html(filterHtml).appendTo('#resultsData');
}
//Iterate over results
var firstElement = true;
var sorted = SearchData.resultData.items.sort(function(a, b) {
return b.weight - a.weight;
});
$(sorted).each(function(){
//$(SearchData.resultData.items).each(function(){
//Get item and diplay to page
var item = $(this)[0];
if (firstElement)
{
firstElement = false;
SearchData.rowDiv = null;
thumbnailsInRow = 0;
setTimeout(SearchData.calculateTextHeight(), 2000); //needs some time to get added to the DOM so that the image has a height. I could hardcode it instead
}
SearchData.renderResults(item);
});
},
thumbnailsInRow :0,
rowDiv:null,
renderResults : function(anItem)
{
var thisHtml = '';
var thisThumbnail = (anItem.thumbnail ? anItem.thumbnail : "default_icon.jpg");
thisHtml += '';
thisHtml += ''+anItem.title+'
';
thisHtml += ''+anItem.description+'
';
thisHtml += '';
/*Instead of adding directly to results data, manage the rows of threes*/
if (!SearchData.rowDiv || SearchData.thumbnailsInRow === 3)
{
SearchData.rowDiv = $('').appendTo('#resultsData').addClass("row").css('border-bottom', '1px solid #DDDDDD').css('margin-bottom', '20px');
SearchData.thumbnailsInRow = 0;
}
var newItem = $('').addClass("search-result-box").html(thisHtml).appendTo(SearchData.rowDiv);
SearchData.thumbnailsInRow++;
},
calculateTextHeight : function() {
if($('#resultsData').hasClass("loading"))
{
$('#resultsData').addClass("loaded").removeClass('loading');
}
},
doTheSearch : function(aFlag, atLeastOneSelected) {
var newResultItems = [];
var selectedCriteria = [];
if(SearchData.types != null && SearchData.types.length > 0) { selectedCriteria.push('types');}
if(SearchData.keywords != null && SearchData.keywords.length > 0) { selectedCriteria.push('keywords');}
if(SearchData.grades != null && SearchData.grades.length > 0) { selectedCriteria.push('grades');}
if(SearchData.topics != null && SearchData.topics.length > 0) { selectedCriteria.push('topics');}
if(SearchData.searchString != null && SearchData.searchString.length > 0 && SearchData.searchString!= "*") { selectedCriteria.push('searchString');}
var searchTextExists = (SearchData.searchString != null && SearchData.searchString.length > 0 && (SearchData.searchString!= "*"));
//Prepare the search terms
var searchStringArray;
/*if (SearchData.searchString.indexOf('"') > -1 || SearchData.searchString.indexOf("'") > -1)
{
//keep the quoted terms together
if (SearchData.searchString.indexOf('"') > -1)
searchStringArray = SearchData.searchString.toLowerCase().split('"');
else
searchStringArray = SearchData.searchString.toLowerCase().split("'");
}
else
{*/
searchStringArray = SearchData.searchString.toLowerCase().split(' ');
$.each(searchStringArray, function(index,value) {
if ($.trim(value).length < 1)
{
searchStringArray.splice(index, 1);
}
//var s_index = $.inArray(value, searchStringArray);
//if (s_index>-1) searchStringArray.splice(s_index, 1);
});
//}
var wordsToExclude = ["a", "the", "is", "and", "or", "what", "how", "where"];
$.each(wordsToExclude, function(index,value) {
var s_index = $.inArray(value, searchStringArray);
if (s_index>-1) searchStringArray.splice(s_index, 1);
});
//Iterate over assets to perform search based on filters
$(SearchData.allResources).each(function() {
var addItem = false;
if (aFlag)
{
addItem = SearchData.returnAll;
if (addItem && (SearchData.searchString != null) && (SearchData.searchString.length > 0) && (SearchData.searchString!= "*"))
{
addItem = false;
}
}
var addString = false;
var addCriteria = false;
//Get data from asset to query against
var xDescription = this.teaser;
var xTitle = this.title;
var xType = this.resource_type;
var xUrl = this.url;
var xGrades = this.grade_level;
var xKeywords = this.keywords;
var xTopics = this.topics;
var xCategory = this.category;
var xThumbnail = this.thumbnail;
/*MD: new weighted results*/
var weight = 1;
var punctuationToRemove = /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,.\/:;<=>?@\[\]^_`{|}~]*/gim;
//var punctuationString = /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,\-.\/:;<=>?@\[\]^_`{|}~]*/gim ... ";
var punctuationToTurnToWhiteSpace = /-/gim;
//Check search string irrelevent of search filters
if(addItem == false && SearchData.searchString != null && SearchData.searchString.length > 0 && (SearchData.searchString!= "*"))
{
/*MD:26_1_2016: extending the following to search for individual terms*/
var searchText = xTitle.toLowerCase();
if(searchText.indexOf(SearchData.searchString.toLowerCase()) >= 0){addString = true;}
searchText = xDescription.toLowerCase();
if(searchText.indexOf(SearchData.searchString.toLowerCase()) >= 0){addString = true;}
searchText = xKeywords.toLowerCase();
if(searchText.indexOf(SearchData.searchString.toLowerCase()) >= 0){addString = true;}
if (addString)
{
//full term was returned for this resource, so I am assigning heavy weight on this resource*/
weight = 100;
}
//Repeat for all separate terms
var searchTextArray = xTitle.toLowerCase().replace(punctuationToRemove, '').replace(punctuationToTurnToWhiteSpace,' ').split(' ');
var difference = $.grep(searchStringArray, function(el) {
var string = el.replace(/\s*/gim,"");
var result1 = $.inArray( $.trim(string), searchTextArray );
var result2 = $.inArray( $.trim(string).concat("s"), searchTextArray );
if ( (string.length>0) && ( (result1 >=0) || (result2 >=0) ) )
return true;
else return false;
});
if (difference.length > 0 )
{
addString = true;
weight += 2 + difference.length/10;
}
searchTextArray = xDescription.toLowerCase().replace(punctuationToRemove, '').replace(punctuationToTurnToWhiteSpace,' ').split(' ');
difference = $.grep(searchStringArray, function(el) {
var string = el.replace(/\s*/gim,"");
var result1 = $.inArray( $.trim(string), searchTextArray );
var result2 = $.inArray( $.trim(string).concat("s"), searchTextArray );
if ( (string.length>0) && ( (result1 >=0) || (result2 >=0) ) )
return true;
else return false;
});
if (difference.length > 0 )
{
addString = true;
weight += 1.1 + difference.length/10;
}
searchTextArray = xKeywords.toLowerCase().replace(/\s*/gim,"").split(',');
difference = $.grep(searchStringArray, function(el) {
var string = el.replace(/\s*/gim,"");
var result1 = $.inArray( $.trim(string), searchTextArray );
var result2 = $.inArray( $.trim(string).concat("s"), searchTextArray );
if ( (string.length>0) && ( (result1 >=0) || (result2 >=0) ) )
return true;
else return false;
});
if (difference.length > 0 )
{
addString = true;
weight += 1.2 + difference.length/10;
}
//**** Catch multiterms search, partial match
difference = $.grep(searchStringArray, function(el) {
if ( (xTitle.toLowerCase().indexOf(el.toLowerCase()) >=0) || (xDescription.toLowerCase().indexOf(el.toLowerCase()) >=0) || (xKeywords.toLowerCase().indexOf(el.toLowerCase()) >=0) )
return true;
else return false;
});
if (difference.length > 0 )
{
addString = true;
weight += 0.3 + difference.length/10;
}
}
//new approach to check all criteria
numberOfCriteria = 0;
for(var index=0;index= 0){
addCriteria = true;
numberOfCriteria++;
break;
}
}
break;
case 'grades':
//Check grades
for (var i=0; i < SearchData.grades.length; i++) {
var grade = SearchData.grades[i].replace(/\s*/gim,"");
if($.inArray(grade, xGrades.replace(/\s*/gim,"").split(',')) >= 0){
addCriteria = true;
numberOfCriteria++;
break;
}
}
break;
case 'keywords':
//Check keywords
for (var i=0; i < SearchData.keywords.length; i++) {
var keyword = SearchData.keywords[i].toLowerCase().replace(/\s*/gim,"");
if($.inArray(keyword, xKeywords.toLowerCase().replace(/\s*/gim,"").split(',')) >= 0){
addCriteria = true;
numberOfCriteria++;
break;
}
}
break;
case 'topics':
//Check topics
for (var i=0; i < SearchData.topics.length; i++) {
var topic = SearchData.topics[i].toLowerCase().replace(/\s*/gim,"");
if($.inArray(topic, xTopics.toLowerCase().replace(/\s*/gim,"").split(',')) >= 0){
addCriteria = true;
numberOfCriteria++;
break;
}
}
break;
}
if (!addString || (addString == '') )
{
addItem = (numberOfCriteria == selectedCriteria.length);
}
else
{
addItem = addString && (!atLeastOneSelected);
if (numberOfCriteria > 0)
{
//addItem = addString && addCriteria;
addItem = (numberOfCriteria == (selectedCriteria.length-1))
}
if (!searchTextExists && numberOfCriteria)
{
addItem = true;
}
}
}
//If nothing is selected revert
if (!(SearchData.searchString != null && SearchData.searchString.length > 0 && (SearchData.searchString!= "*")) && !atLeastOneSelected)
{
addItem = true;
}
if(addItem)
{
var resultItem = {
description: xDescription,
title : xTitle,
type : xType,
thumbnail: xThumbnail,
grades: xGrades,
url : xUrl,
topics : xTopics,
category : xCategory,
keywords : xKeywords,
weight : weight
}
newResultItems.push(resultItem);
}
});
SearchData.resultData.items = newResultItems;
SearchData.displayFilteredResults();
}
};