You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

289 lines
10 KiB

/* (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
*
* All Rights Reserved. See copyright.txt for details and a complete list of authors.
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
* $Id$
*
* Custom search js helper function, mainly to maintain the search state in the url hash
*
* N.B. Only works for a single customsearch instance per page with the id #customsearch_0
*/
(function ($) {
var $csForm, $formInputs;
$(document).on("formSearchReady", function () {
$csForm = $('#customsearch_0');
$(".jscal input[type=text], .jscal input[name=tzoffset], .jscal input[name=tzname], .select2-search__field", $csForm).addClass("ignore");
$formInputs = $("input[type!=Submit]:not(.ignore), select:not(.ignore)", $csForm);
$formInputs.each(function () { // record defaults for search inputs to save cluttering up the location.hash
var $this = $(this);
if ($this.is("input[type=checkbox]") || $this.is("input[type=radio]")) {
$this.data("default", $this.prop("checked"));
} else {
$this.data("default", $this.val());
}
})
.change(function () {
$csForm.submit();
});
// FIXME currently only works with the default id, but avoid js error here when it's customsearch_42 or something
customsearch_0 = typeof customsearch_0 === "object" ? customsearch_0 : {};
$csForm.off("submit").submit(function () {
// process other custom search functions before sumbitting here
customsearch_0.load();
return false;
});
$("#sortby", $csForm).change(function () {
customsearch_0.sort_mode = $(this).val();
// remove the representation of this select in the search
delete customsearch_0.searchdata.sortby;
$csForm.submit();
return false;
});
$("#max", $csForm).change(function () {
customsearch_0.maxRecords = $(this).val();
delete customsearch_0.searchdata.max;
$csForm.submit();
});
getHash();
});
$(document).on("pageSearchReady", function () {
// results loaded
var $csResults = $("#customsearch_0_results");
if (typeof lozad !== "undefined") {
lozad('.lozad', {
load: function (el) {
el.src = el.dataset.src;
el.onload = function () {
el.classList.add('lozadFade');
}
}
}).observe();
}
if ($.applySelect2) {
$csResults.applySelect2();
}
if (jqueryTiki.colorbox) {
$csResults.applyColorbox();
}
if (jqueryTiki.tooltips) {
$csResults.tiki_popover();
}
$('.facets ul').registerFacet();
// sticky facets
var $facets = $(".facets"),
pos = $facets.offset();
if (pos !== undefined) {
var width = $facets.css("width"),
topOffset = 70,
footer = $("footer"),
footPos = footer.offset().top,
facetHeight = $facets.height();
$window.scroll(function () {
var windowpos = $window.scrollTop();
var top = 60;
if (windowpos > pos.top - topOffset) {
if (footPos - windowpos - topOffset < facetHeight) {
top = footPos - windowpos - facetHeight - 10;
} else {
top = 60;
}
$facets.css({
position: "fixed",
top: top + "px",
width: width
});
//console.log(footPos - windowpos);
} else {
$facets.css({
position: "inherit",
top: "auto",
width: width
});
}
});
}
// update the url hash with the current returned search results
setHash();
return true;
});
function setHash()
{
var ser = "";
$formInputs.each(function () {
var $this = $(this),
defaultValue = $this.data("default");
if ($this.is("input[type=checkbox]") || $this.is("input[type=radio]")) {
if ($this.prop("checked") !== defaultValue) {
if ($this.attr("id")) {
ser += $this.attr("id") + "=1&";
} else {
ser += "." + $this.prop("className") + "=1&";
}
}
} else {
var currentValue = $this.val();
if ((typeof currentValue === "string" && currentValue !== defaultValue) || JSON.stringify(currentValue) !== JSON.stringify(defaultValue)) {
var val = encodeURIComponent(currentValue).replace("%20", "+");
if ($this.attr("id")) {
ser += $this.attr("id") + "=" + val + "&";
} else {
ser += "." + $this.prop("className") + "=" + val + "&";
}
}
}
});
var pagenum = parseInt($('.pagination .active').text());
if (pagenum > 1) { // offset
var max = $("#max", $csForm).val();
ser += "offset=" + (pagenum - 1) * max;
}
var $sortLink = $("th a .icon-sort-up,th a .icon-sort-down", ".customsearch_results").parent();
if ($sortLink.length) {
var sort_mode = $sortLink.attr("onclick").match(/\.sort_mode='(.*?)'/);
if (sort_mode) {
ser += "sort_mode=" + sort_mode[1];
}
}
window.location.hash = ser.replace(/&$/, "");
}
function getHash()
{
var key, e, a, r, d, q, hashKey;
if (location.hash) {
// from http://stackoverflow.com/questions/4197591/parsing-url-hash-fragment-identifier-with-javascript - thanks :)
var hashParams = {};
a = /\+/g;
r = /([^&;=]+)=?([^&;]*)/g;
d = function (s) {
return decodeURIComponent(s.replace(a, " "));
};
q = window.location.hash.substring(1);
while (e = r.exec(q)) {
hashParams[d(e[1])] = d(e[2]);
}
var triggerIt = false, $el, selector;
customsearch_0.quiet = true;
for (hashKey in hashParams) {
if (hashParams.hasOwnProperty(hashKey)) {
if (hashKey.indexOf(".") === 0) {
selector = hashKey + ":first";
} else {
selector = "#" + hashKey;
}
$el = $(selector, $csForm);
var value = hashParams[hashKey];
if ($(selector + "[type=checkbox]").length || $(selector + "[type=radio]").length) {
triggerIt = true;
$el.prop("checked", value !== "").trigger('change');
} else {
if ($el.length) {
triggerIt = true;
if ($el.prop("multiple") && value.indexOf(",") > -1) {
value = value.split(",");
}
$el.val(value).trigger('change').trigger("change.select2");
} else {
if (hashKey === "offset") {
triggerIt = true;
customsearch_0.offset = value;
} else if (hashKey === "sort_mode") {
triggerIt = true;
// value is what the sort mode will change to if clicked
if (value.match(/_asc$/)) {
value = value.replace(/_asc$/, '_desc')
} else {
value = value.replace(/_desc$/, '_asc')
}
customsearch_0.sort_mode = value;
}
}
}
}
}
customsearch_0.quiet = false;
if (triggerIt) {
$csForm.submit();
}
} else {
if (window.location.search) {
var params = {};
a = /\+/g;
r = /([^&;=]+)=?([^&;]*)/g;
d = function (s) {
return decodeURIComponent(s.replace(a, " "));
};
q = window.location.search.substring(1);
while (e = r.exec(q)) {
params[d(e[1])] = d(e[2]);
}
customsearch_0.offset = 0;
if (params.q) { // && params.q != ""
$("#search", $csForm).val(params.q).trigger("change");
delete params.q;
}
if (params.t) { // type from portal pages
$("label:contains(" + params.t + ") > input", $csForm).prop("checked", true).trigger("change");
delete params.t;
}
$.each(params, function (k, v) {
var $el = $("[name='" + k + "']");
if (k !== "q" && $el.length) {
$el.val(v).trigger("change.select2");
}
});
$("select", $csForm).trigger("change.select2");
$csForm.submit();
} else {
if (window.location.pathname.indexOf("cat") === 1) {
$csForm.submit();
}
}
}
$csForm.trigger("change.select2");
}
}(jQuery));