///
/*
Red Technology Solution Ltd, Author Alan Strickland
28/03/2012 Version 2.0
*/
// usage: log('inside coolFunc',this,arguments);
// http://paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/
window.log = function () {
log.history = log.history || []; // store logs to an array for reference
log.history.push(arguments);
if (this.console) {
console.log(Array.prototype.slice.call(arguments));
}
};
(function ($) {
var Mode = 0;
var WebServiceMethodName = "";
var WebServiceTokenMethodName = "";
var InitRequest = null;
var SearchRequest = null;
var SearchResponse = null;
var SearchResponses = [];
function indexOfId(array, obj) {
for (var i = 0; i < array.length; i++) {
if (array[i] == obj) {
return i;
}
}
return -1;
};
function addNavigationEvents() {
$(".fnselectfacet").facetedNav('selectFacet');
$(".fnapplyfacet").facetedNav('applyFacet');
$(".fnapplydatefacet").facetedNav('applyDateFacet');
$(".fnexpandfacet").facetedNav('expandFacet');
$(".fncontractfacet").facetedNav('contractFacet');
$(".fnclearfacet").facetedNav('clearFacet');
$(".fnclearallfacets").facetedNav('clearAllFacets');
$(".fncustomparam").facetedNav('addCustomParam');
$(".fnpagesize").facetedNav('changePageSize');
$(".fnselectPageSize").facetedNav('selectPageSize');
$(".fnchangePageSize").facetedNav('changePageSize');
$(".fnFacetTextInput").facetedNav('facetTextSubmit');
$(".fnFacetNavBack").facetedNav('facetNavBack');
$(window).facetedNav('lazyLoadScroll');
}
function addLazyLoadingEvents(target) {
// Add click events to all links and submit buttons to capture the selected page
if (target) {
$(target).find("a,input[type='submit'],input[type='button']").facetedNav('capturePage');
} else {
$(".fnLoadedPage a,.fnLoadedPage input[type='submit'],.fnLoadedPage input[type='button']").facetedNav('capturePage');
}
$(".fnLoadPrevious").facetedNav('lazyLoadPrevious');
}
function addPagingEvents() {
$(".fnchangepage").facetedNav('changePage');
}
function addSortingEvents() {
$(".fnchangesortorder:not(select)").facetedNav('clickSortOrder');
$("select.fnchangesortorder").facetedNav('changeSortOrder');
}
function addFacetOrderToSearchRequest(searchRequest, facetUrlValue) {
if (!searchRequest.AppliedFacetOrder) {
searchRequest.AppliedFacetOrder = new Array();
}
var i = 0, sortorder = 0;
var addAppliedFacetOrder = true;
while (searchRequest["AppliedFacetOrder"][i] != null) {
if (searchRequest["AppliedFacetOrder"][i] == facetUrlValue) {
addAppliedFacetOrder = false;
sortorder = i; //record the position of the current facet being manipulated
}
i++;
}
//Add a record to maintain the order the facets were applied for Google Chrome
if (addAppliedFacetOrder) {
searchRequest["AppliedFacetOrder"][i] = facetUrlValue;
sortorder = i; //record the position of the current facet being manipulated
}
return sortorder;
}
function removeFacetOrderFromSearchRequest(searchRequest, facetUrlValue) {
if (searchRequest.AppliedFacetOrder) {
var i = 0, remove = false;
while (searchRequest["AppliedFacetOrder"][i] != null) {
if (searchRequest["AppliedFacetOrder"][i] == facetUrlValue) {
remove = true;
break;
}
i++;
}
if (remove) {
delete searchRequest["AppliedFacetOrder"][i];
var oldi = i + 1;
while (searchRequest["AppliedFacetOrder"][oldi] != null) {
searchRequest["AppliedFacetOrder"][i] = searchRequest["AppliedFacetOrder"][oldi];
i++;
oldi++;
}
delete searchRequest["AppliedFacetOrder"][(oldi - 1)];
}
}
return false;
}
function addCustomParamToSearchRequest(searchRequest, customparamkey, customparamvalue) {
if (customparamkey && customparamvalue) {
if (!searchRequest.CustomParameters) {
searchRequest.CustomParameters = new Array();
}
if (searchRequest.CustomParameters[customparamkey] || searchRequest.CustomParameters[customparamkey] != customparamvalue) {
searchRequest.CustomParameters[customparamkey] = customparamvalue;
return true;
} else {
return false;
}
}
return false;
}
function ChangePageSizeOnSearchRequest(searchRequest, pagesize) {
if (pagesize) {
if (searchRequest.PageSize != pagesize) {
searchRequest.PageSize = pagesize;
searchRequest.CurrentPage = 1;
searchRequest.CurrentLazyLoadingPage = 1;
return true;
} else {
return false;
}
}
return false;
}
function addFacetToSearchRequest(searchRequest, facetUrlValue, facetValueUrlValue) {
if (facetUrlValue && facetValueUrlValue) {
addFacetOrderToSearchRequest(searchRequest, facetUrlValue);
if (!searchRequest.AppliedFacets) {
searchRequest.AppliedFacets = new Array();
}
//if the applied facet hasn't been initialised
if (!searchRequest.AppliedFacets[facetUrlValue]) {
searchRequest.AppliedFacets[facetUrlValue] = new Array();
}
//Has the value already been added
if (indexOfId(searchRequest.AppliedFacets[facetUrlValue], facetValueUrlValue) < 0) {
//no then add the value
searchRequest.AppliedFacets[facetUrlValue].push(facetValueUrlValue);
return true; //ws request required
} else {
//yes remove the facet value
var fvi = indexOfId(searchRequest.AppliedFacets[facetUrlValue], facetValueUrlValue);
/*delete*/searchRequest.AppliedFacets[facetUrlValue].splice(fvi, 1);
//there are no values applied for this facet so remove the field from the object
if (searchRequest.AppliedFacets[facetUrlValue].length == 0) {
delete searchRequest.AppliedFacets[facetUrlValue];
//we need to remove the AppliedFacetOrder
removeFacetOrderFromSearchRequest(searchRequest, facetUrlValue);
}
return true; //ws request required
}
}
return false; //ws request not required
}
function addDateFacetToSearchRequest(searchRequest, facetid, datefrom, dateto) {
if (facetid && (datefrom || dateto)) {
if (searchRequest.AppliedDateFacets[facetid]) {
removeDateFacetFromSearchRequest(searchRequest, facetid);
}
if (!searchRequest.AppliedDateFacets) {
searchRequest.AppliedDateFacets = new Array();
}
//if the applied facet hasn't been initialised
if (!searchRequest.AppliedDateFacets[facetid]) {
searchRequest.AppliedDateFacets[facetid] = new Object();
}
addFacetOrderToSearchRequest(searchRequest, facetid);
searchRequest.AppliedDateFacets[facetid].DateFrom = datefrom;
searchRequest.AppliedDateFacets[facetid].DateTo = dateto;
return true; //ws request required
} else {
removeDateFacetFromSearchRequest(searchRequest, facetid);
return true; //ws request required
}
}
function removeDateFacetFromSearchRequest(searchRequest, facetid) {
if (facetid) {
if (searchRequest.AppliedDateFacets) {
if (searchRequest.AppliedDateFacets[facetid]) {
delete searchRequest.AppliedDateFacets[facetid];
}
//we need to remove the AppliedFacetOrder
removeFacetOrderFromSearchRequest(searchRequest, facetid);
return true; //ws request required
}
}
return false; //ws request not required
}
function removeFacetFromSearchRequest(searchRequest, facetUrlValue, facetValueUrlValue) {
if (facetUrlValue && facetValueUrlValue) {
if (searchRequest.AppliedFacets) {
if (searchRequest.AppliedFacets[facetUrlValue]) {
//Has the value already been added
if (indexOfId(searchRequest.AppliedFacets[facetUrlValue], facetValueUrlValue) >= 0) {
//yes remove the facet value
var fvi = indexOfId(searchRequest.AppliedFacets[facetUrlValue], facetValueUrlValue);
/*delete*/searchRequest.AppliedFacets[facetUrlValue].splice(fvi, 1);
//there are no values applied for this facet so remove the field from the object
if (searchRequest.AppliedFacets[facetUrlValue].length == 0) {
delete searchRequest.AppliedFacets[facetUrlValue];
//we need to remove the AppliedFacetOrder
removeFacetOrderFromSearchRequest(searchRequest, facetUrlValue);
}
return true; //ws request required
}
}
}
}
return false; //ws request not required
}
function addCategoryFacetToSearchRequest(searchRequest, productCategoryId) {
if (productCategoryId >= 0 && searchRequest.ProductCategoryID != productCategoryId) {
searchRequest.ProductCategoryID = productCategoryId;
return true; //ws request required
} else if (searchRequest.InitialProductCategoryID == 0 && productCategoryId >= 0 && searchRequest.ProductCategoryID == productCategoryId && searchRequest.InitialProductCategoryID != productCategoryId) {
//When progressing up the category hierarchy its possible to get to a state where you want to un-select the top level category.
//However the underlying system thinks you are at the top of hte tree.
//If the current category is the same as the category being selected but not the same as the initial category then we can assume
//we have reached the intial category. this only works if the initial category was 0, as other scenarios initial will equal current at the top of the hierarchy.
searchRequest.ProductCategoryID = searchRequest.InitialProductCategoryID;
return true; //ws request required
} else {
return false; //ws request not required
}
}
function applySliderToNumericalBands() {
$(".sliderhide").show();
$(".fnslider").each(function () {
var $slider = $(this);
var $facetvalues = $(".facetvalue", $slider);
var numberofsteps, slidervaluemin, slidervaluemax;
$(".fnnumericalband", $slider).hide();
numberofsteps = $facetvalues.length;
slidervaluemin = $facetvalues.index($facetvalues.filter(".selected:first"));
slidervaluemax = $facetvalues.index($facetvalues.filter(".selected:last")) + 1;
slidervaluemin = slidervaluemin < 0 ? 0 : slidervaluemin;
slidervaluemax = slidervaluemax <= 0 ? $facetvalues.length : slidervaluemax;
$(".sliderposition", $slider).slider({
range: true,
step: 1,
min: 0,
max: numberofsteps,
values: [slidervaluemin, slidervaluemax],
slide: sliderSlide,
stop: sliderStop
});
setSliderText($slider, slidervaluemin, slidervaluemax);
});
}
function sliderSlide(event, ui) {
if (ui.values[0] == ui.values[1]) {
return false;
}
setSliderText($(this).parent(".fnslider"), ui.values[0], ui.values[1]);
return true;
};
function sliderStop(event, ui) {
//what to do when the slider stops
var slider = $(this).closest(".fnslider");
var minIdx = ui.values[0], maxIdx = ui.values[1];
var searchRequest = $(this).facetedNav('getsearchrequest');
var steps;
steps = $(".facetvalue a", slider);
if (searchRequest && steps.length > 0) {
var facetid = steps.first().dattr("facetid");
delete searchRequest.AppliedFacets[facetid];
removeFacetOrderFromSearchRequest(searchRequest, facetid);
//if we have selected all the bands don't bother adding them as it default to cover the whole range.
if (minIdx != 0 || maxIdx != steps.length) {
for (i = minIdx; i < maxIdx; i++) {
var $step = $(steps[i]);
var facetvalueid = $step.dattr("facetvalueid");
addFacetToSearchRequest(searchRequest, facetid, facetvalueid);
}
}
searchRequest.CurrentPage = 1;
searchRequest.CurrentLazyLoadingPage = 1;
searchRequest.UserInteracted = true;
executeSearchRequest(searchRequest);
}
}
function setSliderText($slider, lowerIdx, upperIdx) {
var sliderTextContainer = $(".slidertext", $slider);
if (sliderTextContainer) {
var bandText;
//get the text to show on the band
bandText = $(".facetvalue:eq(" + lowerIdx + ") .lowerbound", $slider).text();
bandText += " - ";
bandText += $(".facetvalue:eq(" + (upperIdx - 1) + ") .upperbound", $slider).text();
//what to do when the slider stops
sliderTextContainer.html(bandText);
}
};
function renderTemplates(sourceResponse, appendExisting) {
var searchResponse = sourceResponse.d;
if (searchResponse.Paging.TotalResults == 0) {
$(".fnfacetcontainer").trigger('showNoItemsMessage');
} else {
storeSearchResponse(searchResponse);
}
if (searchResponse) {
var facetMenu = $(".fnfacetcontainer");
var facetResults = $(".fnresults");
var facetPaging = $(".fnpaging");
var facetSorting = $(".fnsorting");
var facetUrl = $(".fnoutputfaceturl");
if (facetMenu && facetResults) {
facetMenu.empty();
if (!appendExisting) {
facetResults.empty();
}
if (facetPaging && facetPaging.length > 0) {
facetPaging.empty();
}
if (facetSorting && facetSorting.length > 0) {
facetSorting.empty();
}
var $FacetedNavTemplate = $("#FacetedNavTemplate");
if ($FacetedNavTemplate && $FacetedNavTemplate.length > 0) {
$FacetedNavTemplate.tmpl(searchResponse).appendTo(facetMenu);
}
if (searchResponse.Request.EnableLazyLoading) {
var targetPageDiv = '.fnLoadedPage[data-page=' + searchResponse.Paging.CurrentPage + ']';
if (!appendExisting ) {
if (searchResponse.Request.EnableLazyLoadingOfPreviousPages) facetResults.append('
');
facetResults.append('');
if (!searchResponse.Request.EnableLazyLoadingOfPreviousPages || searchResponse.Request.CurrentLazyLoadingPage == 1) $('#fnNextPageMarker').before('');
}
if ($(targetPageDiv) != undefined && $(targetPageDiv).length > 0) {
facetResults.each(function (i, resultsRegion) {
var $template = $(resultsRegion).prev(".fnresultstemplate");
if ($template) {
$template.tmpl(searchResponse).appendTo(targetPageDiv);
}
});
}
} else {
facetResults.each(function (i, resultsregion) {
var $template = $(resultsregion).prev(".fnresultstemplate");
if ($template) {
$template.tmpl(searchResponse).appendTo(resultsregion);
}
});
}
if (facetPaging && !appendExisting) {
facetPaging.each(function (i, pagingelement) {
var $template = $(pagingelement).prev(".fnpagingtemplate");
if ($template) {
$template.tmpl(searchResponse).appendTo(pagingelement);
}
});
}
if (facetSorting.length > 0) {
var $template = facetSorting.prev(".fnsortingtemplate");
if ($template) {
$template.tmpl(searchResponse).appendTo(facetSorting);
}
}
if (facetUrl && facetUrl.length > 0) {
facetUrl.text(searchResponse.Url);
}
}
BindInterfaceEvents();
}
}
function BindInterfaceEvents() {
addNavigationEvents();
addPagingEvents();
addSortingEvents();
applySliderToNumericalBands();
addLazyLoadingEvents();
$(".fnhide").hide();
}
function storeSearchResponse(searchResponse) {
SearchResponse = searchResponse;
storePagesSearchResponse(searchResponse);
}
function getSearchResponse() {
return SearchResponse;
}
function storeSearchRequest(searchRequest) {
if (!InitRequest) {
InitRequest = $.extend(true, {}, searchRequest);
}
if (typeof (searchRequest) === "string") {
searchRequest = $.parseJSON(searchRequest);
}
SearchRequest = searchRequest;
}
function storePagesSearchResponse(searchResponse) {
// Keep a record of each pages response so the pages token can be used in lazy loading
if (searchResponse.Paging.CurrentPage == 1) {
SearchResponses = [];
}
//SearchResponses.push(searchResponse)
SearchResponses[searchResponse.Paging.CurrentPage] = searchResponse.RequestToken;
}
function getSearchRequest() {
var searchRequest = SearchRequest;
if (!searchRequest) {
searchRequest = InitRequest;
}
// If the explain faceted results component is included explain the faceted results
if ($(".insite-explainfacetedresults").length != 0)
searchRequest.Explain = true;
return searchRequest;
}
function getInitSearchRequest() {
return InitRequest;
}
function getTokenFromFragment() {
var fragment = $.param.fragment();
var hash = $.deparam.fragment(fragment);
if (hash && hash.r) {
return hash.r;
} else {
return null;
}
}
function getTokenFromQueryString() {
var qsParams = $.deparam.querystring();
return qsParams.r;
}
function setToken(token, noUrlChange) {
if (!noUrlChange) {
//store the response on the url
$.bbq.pushState({ r: token }, 2);
}
}
function updateDOM(token) {
//add query string to decorated ");
}
function processLazyLoad(searchRequest, targetPageNumber, scrollToPage) {
var hideLoadingImages = (targetPageNumber == searchRequest.CurrentLazyLoadingPage + 1);
var ajaxRequests = [];
// Loop through all the pages loading as required
for (var pageNumber = searchRequest.EnableLazyLoadingOfPreviousPages ? targetPageNumber : 1; pageNumber <= targetPageNumber; pageNumber++) {
if (!$('.fnLoadedPage[data-page=' + pageNumber + ']').length && $('#fnNextPageMarker').length > 0) {
log("now inserting lazy load page " + pageNumber);
$('#fnNextPageMarker').before('');
var copyOfSearchRequest = $.extend(true, {}, searchRequest);
copyOfSearchRequest.CurrentPage = pageNumber;
ajaxRequests.push(fetchPageSearchRequest(copyOfSearchRequest, hideLoadingImages, function (response, hideLoadingImages) {
log("callback hideLoadingImages = " + hideLoadingImages);
storeSearchResponse(response.d);
var targetPageDiv = '.fnLoadedPage[data-page=' + response.d.Paging.CurrentPage + ']';
var $facetResults = $('.fnresults');
if ($facetResults && $(targetPageDiv) != undefined && $(targetPageDiv).length > 0) {
$facetResults.each(function (i, resultsRegion) {
var $template = $(resultsRegion).prev(".fnresultstemplate");
if ($template) {
$template.tmpl(response.d).appendTo(targetPageDiv);
addLazyLoadingEvents(targetPageDiv);
addPagingEvents();
}
});
var previousPage = response.d.Paging.CurrentPage - 1;
if ($('.fnLoadedPage[data-page=' + previousPage + ']').length && $('.fnLoadedPage[data-page=' + previousPage + ']').length > 0) {
$('.fnLoadPrevious[data-page=' + previousPage + ']').hide();
}
if (targetPageNumber == response.d.Paging.CurrentPage) {
history.replaceState(null, null, "#r=" + encodeURIComponent(response.d.RequestToken));
updateDOM(response.d.RequestToken);
}
if (hideLoadingImages == true) {
methods.HideLazyLoadingPanel();
methods.hideLoadingImages();
}
}
}));
}
}
$.when.apply($, ajaxRequests).then(function () {
searchRequest.CurrentLazyLoadingPage = targetPageNumber;
if (scrollToPage) {
var testInterval = window.setInterval(function () {
var $templateRenderedContent = $('.fnLoadedPage[data-page=' + targetPageNumber + ']');
if ($templateRenderedContent !== undefined && $templateRenderedContent.html() !== undefined && $templateRenderedContent.html().length > 0) {
// Templates have been rendered, scroll to the target
var evArgs = { cancel: false };
$(".fnfacetcontainer").trigger("LazyLoadingScrollOverride", evArgs, targetPageNumber);
if (!evArgs.cancel) {
$("html, body").animate({
scrollTop: $('.fnLoadedPage[data-page=' + targetPageNumber + ']').offset().top
}, 2000);
}
clearInterval(testInterval);
}
}, 100);
}
});
}
function fetchPageSearchRequest(searchRequest, hideLoadingImages, callback) {
var jsonSearchRequest = $.toJSON(searchRequest);
var dataRequest = '{"SearchRequest":' + jsonSearchRequest + "}";
return $.ajax({
type: "POST",
url: "/Services/FacetedNavigation.asmx/" + WebServiceMethodName,
data: dataRequest,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
if (callback) {
callback(response, hideLoadingImages);
}
// If the response includes an explanation of the faceted results trigger an event to show the explanation
if (response.d.Explanation) {
$(".insite-explainfacetedresults").trigger('showfacetedresultsexplanation', response);
}
},
error: function (xmlHttpRequest, textStatus, errorThrown) {
methods.HideLazyLoadingPanel();
},
async: true
});
}
function executeSearchRequest(searchRequest, noUrlChange) {
if (!noUrlChange) noUrlChange = false;
methods.showLoadingImages();
var jsonSearchRequest = $.toJSON(searchRequest);
var dataRequest = '{"SearchRequest":' + jsonSearchRequest + '}';
$.ajax({
type: "POST",
url: "/Services/FacetedNavigation.asmx/" + WebServiceMethodName,
data: dataRequest,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
//Store the response for future use
storeSearchResponse(response.d);
//Store the Request For later
storeSearchRequest(response.d.Request);
//render the jTmpl scripts
renderTemplates(response);
setToken(response.d.RequestToken, noUrlChange);
updateDOM(response.d.RequestToken);
$('.fnresults').attr('data-totalpagecount', response.d.Paging.TotalPages);
// Lazy load additional pages
if (response.d.Request.EnableLazyLoading && response.d.Request.CurrentLazyLoadingPage > 1) {
processLazyLoad(response.d.Request, response.d.Request.CurrentLazyLoadingPage, false);
}
// If the response includes an explanation of the faceted results trigger an event to show the explanation
if (response.d.Explanation) {
$(".insite-explainfacetedresults").trigger('showfacetedresultsexplanation', response);
}
methods.hideLoadingImages();
},
error: function (xmlHttpRequest, textStatus, errorThrown) {
methods.hideLoadingImages();
},
async: true
});
}
function executeTokenSearchRequest(token) {
methods.showLoadingImages();
var dataRequest = '{"Token":"' + token + '"}';
$.ajax({
type: "POST",
url: "/Services/FacetedNavigation.asmx/" + WebServiceTokenMethodName,
data: dataRequest,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
//Store the response for future use
storeSearchResponse(response.d);
//store the request for future use
storeSearchRequest(response.d.Request);
//render the jTmpl scripts
renderTemplates(response);
//update maintain postback elements
updateDOM(response.d.RequestToken);
$('.fnresults').attr('data-totalpagecount', response.d.Paging.TotalPages);
// Lazy load additional pages
if (response.d.Request.EnableLazyLoading && response.d.Request.CurrentLazyLoadingPage > 1) {
processLazyLoad(response.d.Request, response.d.Request.CurrentLazyLoadingPage, true);
}
// If the response includes an explanation of the faceted results trigger an event to show the explanation
if (response.d.Explanation) {
$(".insite-explainfacetedresults").trigger('showfacetedresultsexplanation', response);
}
methods.hideLoadingImages();
},
error: function (xmlHttpRequest, textStatus, errorThrown) {
methods.hideLoadingImages();
},
async: true
});
}
var executeHashChange = function (e) {
var request = getSearchRequest();
var response = getSearchResponse();
var token = getTokenFromFragment();
if (!response) {
//if search request is null, initialise page
if (token) {
executeTokenSearchRequest(token);
} else {
if (Mode == 1) {
//only execute the jsonSearchRequest
executeSearchRequest(request);
} else {
// check if there is a token in the query string
var QsToken = getTokenFromQueryString();
if (QsToken !== undefined) {
// update the stored token and execute the request
updateDOM(QsToken);
executeTokenSearchRequest(QsToken);
} else {
// No token is present so bind the events and nothing else
BindInterfaceEvents();
}
}
}
} else {
//else check if current fragment is differnt to stored fragment, yes then execute request
if (!token) {
var initRequest = getInitSearchRequest();
if (initRequest) {
executeSearchRequest(initRequest, true);
}
} else if (token != response.RequestToken) {
executeTokenSearchRequest(token);
}
}
};
var methods = {
ServerInit:
function (jsonSearchRequest) {
Mode = 2; //Server Only
},
ClientInit:
function (searchRequest, webServiceMethodName, webServiceTokenMethodName) {
Mode = 1; //Client Only
WebServiceMethodName = webServiceMethodName;
WebServiceTokenMethodName = webServiceTokenMethodName;
storeSearchRequest(searchRequest);
$(".fnhide").hide();
$(window).bind("hashchange", executeHashChange);
$(window).trigger('hashchange');
},
FullInit:
function (searchRequest, webServiceMethodName, webServiceTokenMethodName) {
Mode = 0; //Server And Client
WebServiceMethodName = webServiceMethodName;
WebServiceTokenMethodName = webServiceTokenMethodName;
storeSearchRequest(searchRequest);
$(".fnhide").hide();
$(window).bind("hashchange", executeHashChange);
$(window).trigger('hashchange');
},
applyFacet:
function () {
$(this).each(function (i, link) {
$(this).on('click', function () {
var searchRequest = getSearchRequest();
if (searchRequest) {
var facetid = $(this).dattr("facetid");
var facetvalueid = $(this).dattr("facetvalueid");
var productcategoryid = $(this).dattr("productcategoryid");
var requestRequired = false;
if (!requestRequired)
requestRequired = addFacetToSearchRequest(searchRequest, facetid, facetvalueid);
if (!requestRequired)
requestRequired = addCategoryFacetToSearchRequest(searchRequest, productcategoryid);
if (requestRequired) {
searchRequest.CurrentPage = 1;
searchRequest.CurrentLazyLoadingPage = 1;
searchRequest.UserInteracted = true;
executeSearchRequest(searchRequest);
} else {
methods.hideLoadingImages();
}
} else {
alert("Search Request Not Initialised.");
}
return false;
});
});
},
applyDateFacet:
function () {
$(this).each(function (i, link) {
$(this).on('click', function () {
var searchRequest = getSearchRequest();
if (searchRequest) {
var facetid = $(this).dattr("facetid");
var dateFrom = $(".fndatefrom[facetid=" + facetid + "]").val();
var dateTo = $(".fndateto[facetid=" + facetid + "]").val();
var requestRequired = false;
if (!requestRequired)
requestRequired = addDateFacetToSearchRequest(searchRequest, facetid, dateFrom, dateTo);
if (requestRequired) {
searchRequest.CurrentPage = 1;
searchRequest.CurrentLazyLoadingPage = 1;
searchRequest.UserInteracted = true;
executeSearchRequest(searchRequest);
} else {
methods.hideLoadingImages();
}
} else {
alert("Search Request Not Initialised.");
}
return false;
});
});
},
selectPageSize:
function () {
$(this).each(function (i, link) {
$(this).on('change', function () {
var searchRequest = getSearchRequest();
if (searchRequest) {
//get the selected option
var $seloption = $(this.options[this.selectedIndex]);
if ($seloption) {
//get the facetid
var pagesize = parseInt($seloption.dattr("pagesize"));
var requestRequired = false;
if (pagesize) {
//if the value is more than 0 then add the facet value to be applied
if (pagesize >= -1) {
var addrequestRequired = false;
if (!addrequestRequired)
addrequestRequired = ChangePageSizeOnSearchRequest(searchRequest, pagesize);
if (addrequestRequired)
requestRequired = true;
}
//if there is a request required then change the address to fire the execution method
if (requestRequired) {
// (STH) This function should never be called when lazy loading is enabled, do not set lazy loading properties
searchRequest.CurrentPage = 1;
searchRequest.CurrentLazyLoadingPage = 1;
searchRequest.UserInteracted = true;
executeSearchRequest(searchRequest);
} else {
//no request required, hide the loading images.
methods.hideLoadingImages();
}
}
}
} else {
alert("Search Request Not Initialised.");
}
return false;
});
});
},
selectFacet:
function () {
$(this).each(function (i, link) {
$(this).on('change', function () {
var searchRequest = getSearchRequest();
if (searchRequest) {
//get the selected option
var $seloption = $(this.options[this.selectedIndex]);
if ($seloption) {
//get the facetid
var facetid = $(this).dattr("facetid");
var facetvalueid = $seloption.dattr("facetvalueid");
var requestRequired = false;
if (facetid) {
//Remove any current applied facets
//if the applied facets hasn't been initialised
if (searchRequest.AppliedFacets) {
delete searchRequest.AppliedFacets[facetid];
removeFacetOrderFromSearchRequest(searchRequest, facetid);
requestRequired = true;
}
//if the value is more than 0 then add the facet value to be applied
if (facetvalueid > 0) {
var productcategoryid = $(this).dattr("productcategoryid");
var addrequestRequired = false;
if (!addrequestRequired)
addrequestRequired = addFacetToSearchRequest(searchRequest, facetid, facetvalueid);
if (!addrequestRequired)
addrequestRequired = addCategoryFacetToSearchRequest(searchRequest, productcategoryid);
if (addrequestRequired)
requestRequired = true;
}
//if there is a request required then change the address to fire the execution method
if (requestRequired) {
searchRequest.CurrentPage = 1;
searchRequest.CurrentLazyLoadingPage = 1;
searchRequest.UserInteracted = true;
executeSearchRequest(searchRequest);
} else {
//no request required, hide the loading images.
methods.hideLoadingImages();
}
}
}
} else {
alert("Search Request Not Initialised.");
}
return false;
});
});
},
expandFacet:
function () {
$(this).each(function (i, link) {
$(link).on('click', function () {
var searchRequest = getSearchRequest();
if (searchRequest) {
var facetid = $(this).dattr("facetid");
var requestRequired = false;
if (facetid) {
//if the expanded facets hasn't been initialised
if (!searchRequest.ExpandedFacets) {
searchRequest.ExpandedFacets = new Array();
}
//if the expanded facet hasn't been added
if (indexOfId(searchRequest.ExpandedFacets, facetid) < 0) {
searchRequest.ExpandedFacets.push(facetid);
requestRequired = true;
}
}
if (requestRequired) {
searchRequest.CurrentPage = 1;
executeSearchRequest(searchRequest);
} else {
methods.hideLoadingImages();
}
} else {
alert("Search Request Not Initialised.");
}
return false;
});
});
},
contractFacet:
function () {
$(this).each(function (i, link) {
$(link).on('click', function () {
var searchRequest = getSearchRequest();
if (searchRequest) {
var facetid = $(this).dattr("facetid");
var requestRequired = false;
if (facetid) {
//if the expanded facets hasn't been initialised
if (!searchRequest.ExpandedFacets) {
searchRequest.ExpandedFacets = new Array();
}
//if the expanded facet hasn't been added
var i = indexOfId(searchRequest.ExpandedFacets, facetid);
if (i >= 0) {
searchRequest.ExpandedFacets.pop(i);
requestRequired = true;
}
}
if (requestRequired) {
searchRequest.CurrentPage = 1;
executeSearchRequest(searchRequest);
} else {
methods.hideLoadingImages();
}
} else {
alert("Search Request Not Initialised.");
}
return false;
});
});
},
changePage:
function () {
$(this).each(function (i, link) {
$(link).on('click', function () {
$('.fnfacetcontainer').trigger('ChangePageClick', $(this));
var searchRequest = getSearchRequest();
if (searchRequest) {
var pageid = $(this).dattr("pageid");
var requestRequired = false;
if (pageid) {
searchRequest.CurrentPage = pageid;
requestRequired = true;
}
if (requestRequired) {
searchRequest.UserInteracted = true;
if (searchRequest.EnableLazyLoading) {
processLazyLoad(searchRequest, searchRequest.CurrentPage, true);
} else {
executeSearchRequest(searchRequest);
}
} else {
methods.hideLoadingImages();
}
} else {
alert("Search Request Not Initialised.");
}
return false;
});
});
},
clickSortOrder:
function () {
$(this).each(function (i, link) {
$(link).on('click', function () {
var searchRequest = getSearchRequest();
if (searchRequest) {
var fieldid = parseInt($(this).dattr("sortfieldid"));
var requestRequired = false;
if (fieldid !== null) {
if (searchRequest.SortFieldID !== fieldid) {
searchRequest.SortFieldID = fieldid;
requestRequired = true;
}
}
if (requestRequired) {
searchRequest.CurrentPage = 1;
searchRequest.CurrentLazyLoadingPage = 1;
searchRequest.UserInteracted = true;
executeSearchRequest(searchRequest);
} else {
methods.hideLoadingImages();
}
} else {
alert("Search Request Not Initialised.");
}
return false;
});
});
},
changeSortOrder:
function () {
$(this).each(function (i, link) {
$(link).on('change', function () {
var searchRequest = getSearchRequest();
if (searchRequest) {
var $seloption = $(this.options[this.selectedIndex]);
if ($seloption) {
var fieldid = parseInt($seloption.dattr("sortfieldid"));
var requestRequired = false;
if (fieldid !== null) {
if (searchRequest.SortFieldID !== fieldid) {
searchRequest.SortFieldID = fieldid;
requestRequired = true;
}
}
if (requestRequired) {
searchRequest.CurrentPage = 1;
searchRequest.CurrentLazyLoadingPage = 1;
searchRequest.UserInteracted = true;
executeSearchRequest(searchRequest);
}
}
} else {
alert("Search Request Not Initialised.");
}
return false;
});
});
},
clearFacet:
function () {
$(this).each(function (i, link) {
$(link).on('click', function () {
var searchRequest = getSearchRequest();
if (searchRequest) {
var $clearSource = $(this);
var facetid = $clearSource.dattr("facetid");
var requestRequired = false;
if (facetid) {
//if the applied facets hasn't been initialised
if (searchRequest.AppliedFacets) {
delete searchRequest.AppliedFacets[facetid];
delete searchRequest.AppliedDateFacets[facetid];
removeFacetOrderFromSearchRequest(searchRequest, facetid);
requestRequired = true;
}
if ($clearSource.dattr("istextinput")) {
searchRequest.SearchTerm = "";
}
if ($clearSource.parents(".fnFacetTextInput").length > 0) {
searchRequest.SearchTerm = "";
}
}
if (requestRequired) {
searchRequest.CurrentPage = 1;
searchRequest.CurrentLazyLoadingPage = 1;
searchRequest.UserInteracted = true;
executeSearchRequest(searchRequest);
} else {
methods.hideLoadingImages();
}
} else {
alert("Search Request Not Initialised.");
}
return false;
});
});
},
clearAllFacets:
function () {
$(this).each(function (i, link) {
$(link).on('click', function () {
var searchRequest = getSearchRequest();
if (searchRequest) {
var requestRequired = false;
//remove applied facets and facet sort order
if (searchRequest.AppliedFacets) {
$.each(searchRequest.AppliedFacets, function (index, obj) {
delete searchRequest.AppliedFacets[index];
removeFacetOrderFromSearchRequest(searchRequest, index);
});
$.each(searchRequest.AppliedDateFacets, function (index, obj) {
delete searchRequest.AppliedDateFacets[index];
removeFacetOrderFromSearchRequest(searchRequest, index);
});
requestRequired = true;
if (searchRequest.IsSearchTermDefinedByFacet) {
searchRequest.IsSearchTermDefinedByFacet = false;
searchRequest.SearchTerm = "";
}
}
$(".fnfacetcontainer").trigger('clearallfacets', { searchRequest: searchRequest });
if (requestRequired) {
searchRequest.CurrentPage = 1;
searchRequest.CurrentLazyLoadingPage = 1;
searchRequest.UserInteracted = true;
executeSearchRequest(searchRequest);
} else {
methods.hideLoadingImages();
}
} else {
alert("Search Request Not Initialised.");
}
return false;
});
});
},
addCustomParam:
function () {
$(this).each(function (i, link) {
$(this).on('click', function () {
var searchRequest = getSearchRequest();
if (searchRequest) {
var key = $(this).dattr("customparamkey");
var value = $(this).dattr("customparamvalue");
var requestRequired = false;
if (!requestRequired)
requestRequired = addCustomParamToSearchRequest(searchRequest, key, value);
if (requestRequired) {
searchRequest.CurrentPage = 1;
searchRequest.CurrentLazyLoadingPage = 1;
searchRequest.UserInteracted = true;
executeSearchRequest(searchRequest);
} else {
methods.hideLoadingImages();
}
} else {
alert("Search Request Not Initialised.");
}
return false;
});
});
},
changePageSize:
function () {
$(this).each(function (i, link) {
$(this).on('click', function () {
var searchRequest = getSearchRequest();
if (searchRequest) {
var pagesize = parseInt($(this).dattr("pagesize"));
var requestRequired = false;
if (pagesize) {
//if the value is more than 0 then add the facet value to be applied
if (pagesize >= -1) {
var addrequestRequired = false;
if (!addrequestRequired)
addrequestRequired = ChangePageSizeOnSearchRequest(searchRequest, pagesize);
if (addrequestRequired)
requestRequired = true;
}
//if there is a request required then change the address to fire the execution method
if (requestRequired) {
searchRequest.CurrentPage = 1;
searchRequest.CurrentLazyLoadingPage = 1;
searchRequest.UserInteracted = true;
executeSearchRequest(searchRequest);
} else {
//no request required, hide the loading images.
methods.hideLoadingImages();
}
}
} else {
alert("Search Request Not Initialised.");
}
return false;
});
});
},
facetTextSubmit:
function () {
$(this).each(function (i, link) {
$(this).submit(function () {
var searchRequest = getSearchRequest();
if (searchRequest) {
if (searchRequest.ClearAppliedFacetsOnTextSearch) {
if (searchRequest.AppliedFacets) {
searchRequest.AppliedFacets = {};
searchRequest.AppliedFacetOrder = {};
}
}
var $tb = $(this).find('input[type="text"]');
searchRequest.SearchTerm = $tb.val();
searchRequest.UserInteracted = true;
searchRequest.IsSearchTermDefinedByFacet = true;
executeSearchRequest(searchRequest);
methods.hideLoadingImages();
} else {
alert("Search Request Not Initialised.");
}
return false;
});
});
},
showLoadingImages: function () {
$(".fnfacetcontainer").trigger('showloadingimages');
$(".fnloading").addClass("facetednavloading");
},
hideLoadingImages: function () {
$(".fnfacetcontainer").trigger('hideloadingimages');
$(".fnloading").removeClass("facetednavloading");
},
ShowLazingLoadingPanel: function () {
$(".fnLazyLoadingLoading").css("display", "inline");
},
HideLazyLoadingPanel: function () {
$(".fnLazyLoadingLoading").css("display", "none");
},
ApplyBandingFacet: function (searchRequest, bands, min, max) {
var i = 0;
delete searchRequest.AppliedFacets[bands[i]["facetid"]];
var requestRequired = false;
while (bands[i] != null) {
if (min <= bands[i]["lower"] && (!max || max >= bands[i]["upper"])) {
addFacetToSearchRequest(searchRequest, bands[i]["facetid"], bands[i]["facetvalueid"]);
requestRequired = true;
} else {
removeFacetFromSearchRequest(searchRequest, bands[i]["facetid"], bands[i]["facetvalueid"]);
requestRequired = true;
}
i++;
}
searchRequest.UserInteracted = true;
searchRequest.CurrentPage = 1;
searchRequest.CurrentLazyLoadingPage = 1;
if (requestRequired)
executeSearchRequest(searchRequest);
},
getsearchrequest: function () {
return getSearchRequest();
},
capturePage: function () {
// When a link or button is clicked update the token to match the selected lazy loading page
var searchRequest = getSearchRequest();
if (searchRequest.EnableLazyLoading) {
$(this).each(function (i, link) {
$(this).on('click', function () {
// Get the current page
var currentPage = $(this).parents('.fnLoadedPage');
if (currentPage != undefined) {
var currentPageNum = parseInt(currentPage.attr('data-page'));
if (currentPageNum > 0) {
// get the correct token for the current page
var token = SearchResponses[currentPageNum];
if (token == undefined) {
token = "";
}
if (searchRequest.EnableLazyLoadingOfPreviousPages) {
if (token == "") {
history.replaceState(null, null, location.pathname + location.search);
} else {
history.replaceState(null, null, "#r=" + encodeURIComponent(token));
}
}
setToken(token, true);
updateDOM(token);
console.log("Update token to page: " + currentPageNum + " token: " + token);
}
}
});
});
}
},
lazyLoadScroll: function () {
var searchRequest = getSearchRequest();
if (searchRequest && searchRequest.EnableLazyLoading) {
// Hide the paging if lazy loading is enabled
$('.fnHideOnLazyLoading').css('display', 'none');
}
$(window).scroll(function () {
var searchRequest = getSearchRequest();
if (searchRequest && searchRequest.EnableLazyLoading) {
// Only execute lazy loading is there are more than 1 pages.
var numPages = $('.fnresults').attr('data-totalpagecount');
if (numPages > 1) {
var currentPage;
if (searchRequest.EnableLazyLoadingOfPreviousPages) {
currentPage = searchRequest.CurrentLazyLoadingPage;
} else {
currentPage = searchRequest.CurrentPage;
}
var $templateRenderedContent = $('.fnLoadedPage[data-page=' + currentPage + ']');
if ($templateRenderedContent !== undefined && $templateRenderedContent.html() !== undefined && $templateRenderedContent.html().length > 0) {
var lastRenderedTemplateOffsetFromTop = $templateRenderedContent.offset().top;
var lastRenderedTemplateHeight = $templateRenderedContent.height();
var bottomOfWindowDistanceFromTop = ($(window).scrollTop() + $(window).height());
var lazyLoadTriggerPoint = (lastRenderedTemplateOffsetFromTop + (lastRenderedTemplateHeight * searchRequest.LazyLoadingLoadPosition))
if (bottomOfWindowDistanceFromTop > lazyLoadTriggerPoint) {
var pageToLoad = parseInt(searchRequest.CurrentLazyLoadingPage) + 1;
if (pageToLoad <= numPages) {
methods.ShowLazingLoadingPanel();
searchRequest.CurrentPage = pageToLoad;
processLazyLoad(searchRequest, pageToLoad, false);
}
}
}
}
}
});
},
lazyLoadPrevious: function () {
$(this).each(function (i, link) {
$(this).on('click', function () {
var searchRequest = getSearchRequest();
if (searchRequest && searchRequest.EnableLazyLoading && searchRequest.EnableLazyLoadingOfPreviousPages) {
$('.fnHideOnLazyLoading').css('display', 'none');
var target = $(this);
var hideLoadingImages = true;
var ajaxRequests = [];
var targetPage = target.dattr("page");
if (targetPage) {
var currentPage = targetPage + 1;
if (!$('.fnLoadedPage[data-page=' + targetPage + ']').length) {
log("now inserting previous page " + targetPage);
$('#fnPrevPageMarker').after('');
var targetPageDiv = '.fnLoadedPage[data-page=' + targetPage + ']';
var copyOfSearchRequest = $.extend(true, {}, searchRequest);
copyOfSearchRequest.CurrentPage = targetPage;
ajaxRequests.push(fetchPageSearchRequest(copyOfSearchRequest, hideLoadingImages, function (response, hideLoadingImages) {
log("callback hideLoadingImages = " + hideLoadingImages);
storeSearchResponse(response.d);
var $facetResults = $('.fnresults');
if ($facetResults && $(targetPageDiv) != undefined && $(targetPageDiv).length > 0) {
$facetResults.each(function (i, resultsRegion) {
var $template = $(resultsRegion).prev(".fnresultstemplate");
if ($template) {
var $currentPageDiv = $('.fnLoadedPage[data-page=' + currentPage + ']');
var currentScrollPosition = $currentPageDiv.offset().top - $("html, body").scrollTop();
$template.tmpl(response.d).appendTo(targetPageDiv);
addLazyLoadingEvents(targetPageDiv);
addPagingEvents();
var testInterval = window.setInterval(function () {
var $templateRenderedContent = $('.fnLoadedPage[data-page=' + targetPage + ']');
if ($templateRenderedContent !== undefined && $templateRenderedContent.html() !== undefined && $templateRenderedContent.html().length > 0) {
var evArgs = { cancel: false, offset: 0 };
$(".fnfacetcontainer").trigger("LazyLoadingScrollOverride", evArgs, currentPage);
if (!evArgs.cancel) {
target.hide();
$("html, body").animate({
scrollTop: $currentPageDiv.offset().top - currentScrollPosition - evArgs.offset
}, 0);
}
clearInterval(testInterval);
}
}, 100);
}
});
if (searchRequest.CurrentLazyLoadingPage == response.d.Paging.CurrentPage) {
history.replaceState(null, null, "#r=" + encodeURIComponent(response.d.RequestToken));
updateDOM(response.d.RequestToken);
} else {
var token = SearchResponses[response.d.Paging.CurrentPage];
if (token == undefined) {
history.replaceState(null, null, location.pathname);
} else {
history.replaceState(null, null, "#r=" + encodeURIComponent(token));
}
setToken(token, true);
updateDOM(token);
console.log("Update token to page: " + response.d.Paging.CurrentPage + " token: " + token);
}
if (hideLoadingImages == true) {
methods.HideLazyLoadingPanel();
methods.hideLoadingImages();
}
}
}));
}
}
}
return false;
});
});
},
facetNavBack: function () {
$(this).each(function (i, link) {
$(this).on('click', function () {
window.history.back();
return false;
});
});
},
removeFacetOrderFromSearchRequest: function (searchRequest, facetUrlValue) {
removeFacetOrderFromSearchRequest(searchRequest, facetUrlValue);
},
addFacetToSearchRequest: function (searchRequest, facetUrlValue, facetValueUrlValue) {
addFacetToSearchRequest(searchRequest, facetUrlValue, facetValueUrlValue);
},
executeSearchRequest: function (searchRequest, noUrlChange) {
executeSearchRequest(searchRequest, noUrlChange);
}
};
$.fn.facetedNav = function (method) {
// Method calling logic
if (methods[method]) {
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
} else if (typeof method === 'object' || !method) {
return methods.init.apply(this, arguments);
} else {
$.error('Method ' + method + ' does not exist on jQuery.facetedNav');
}
};
})(jQuery);