/(function($){
Drupal.behaviors.block_carousel = {
attach: function (context, settings) {
if ($('.page-node .owl-carousel-rte').length) {
$('.owl-carousel-rte').owlCarousel({
pagination: false,
navigation: true, // Show next and prev buttons
slideSpeed: 300,
paginationSpeed: 400,
singleItem: true,
// "singleItem:true" is a shortcut for:
// items : 1,
// itemsDesktop : false,
// itemsDesktopSmall : false,
// itemsTablet: false,
itemsMobile: false
});
}
}
};
})(jQuery);
;/*})'"*/
;/*})'"*/
(function ($) {
// Store the original beforeSerialize, as we want to continue using
// it after we've overridden it.
Drupal.ajax.prototype.originalBeforeSerialize = Drupal.ajax.prototype.beforeSerialize;
/**
* Override core's beforeSerialize.
*
* We switch to using GET if this is for an ajax View.
* We also avoid adding ajax_html_id and ajax_page_state.
* (This happens in core's beforeSerialize).
*/
Drupal.ajax.prototype.beforeSerialize = function (element, options) {
// If this is for a view, switch to GET.
if (options.url &&
options.url.indexOf('/views/ajax') !== -1 &&
Drupal.settings.viewsAjaxGet &&
$.inArray(options.data.view_name, Drupal.settings.viewsAjaxGet) !== -1) {
// @See Drupal.ajax.prototype.beforeSerialize
if (this.form) {
var settings = this.settings || Drupal.settings;
Drupal.detachBehaviors(this.form, settings, 'serialize');
}
options.type = 'GET';
return;
}
return this.originalBeforeSerialize(element, options);
};
})(jQuery);
;/*})'"*/
;/*})'"*/
/**
* @file views_load_more.js
*
* Handles the AJAX pager for the view_load_more plugin.
*/
(function ($) {
/**
* Provide a series of commands that the server can request the client perform.
*/
Drupal.ajax.prototype.commands.viewsLoadMoreAppend = function (ajax, response, status) {
// Get information from the response. If it is not there, default to
// our presets.
var wrapper = response.selector ? $(response.selector) : $(ajax.wrapper);
var method = response.method || ajax.method;
var targetList = response.targetList || '';
var effect = ajax.getEffect(response);
var pager_selector = response.options.pager_selector ? response.options.pager_selector : '.pager-load-more';
// We don't know what response.data contains: it might be a string of text
// without HTML, so don't rely on jQuery correctly iterpreting
// $(response.data) as new HTML rather than a CSS selector. Also, if
// response.data contains top-level text nodes, they get lost with either
// $(response.data) or $('
').replaceWith(response.data).
var new_content_wrapped = $('').html(response.data);
var new_content = new_content_wrapped.contents();
// For legacy reasons, the effects processing code assumes that new_content
// consists of a single top-level element. Also, it has not been
// sufficiently tested whether attachBehaviors() can be successfully called
// with a context object that includes top-level text nodes. However, to
// give developers full control of the HTML appearing in the page, and to
// enable Ajax content to be inserted in places where DIV elements are not
// allowed (e.g., within TABLE, TR, and SPAN parents), we check if the new
// content satisfies the requirement of a single top-level element, and
// only use the container DIV created above when it doesn't. For more
// information, please see http://drupal.org/node/736066.
if (new_content.length != 1 || new_content.get(0).nodeType != 1) {
new_content = new_content_wrapped;
}
// If removing content from the wrapper, detach behaviors first.
var settings = response.settings || ajax.settings || Drupal.settings;
Drupal.detachBehaviors(wrapper, settings);
if ($.waypoints != undefined) {
$.waypoints('refresh');
}
// Set up our default query options. This is for advance users that might
// change there views layout classes. This allows them to write there own
// jquery selector to replace the content with.
// Provide sensible defaults for unordered list, ordered list and table
// view styles.
var content_query = targetList && !response.options.content ? '> .view-content ' + targetList : response.options.content || '> .view-content';
// If we're using any effects. Hide the new content before adding it to the DOM.
if (effect.showEffect != 'show') {
new_content.find(content_query).children().hide();
}
// Update the pager
// Find both for the wrapper as the newly loaded content the direct child
// .item-list in case of nested pagers
wrapper.find(pager_selector).replaceWith(new_content.find(pager_selector));
// Add the new content to the page.
wrapper.find(content_query)[method](new_content.find(content_query).children());
// Re-class the loaded content.
// @todo this is faulty in many ways. first of which is that user may have configured view to not have these classes at all.
wrapper.find(content_query).children()
.removeClass('views-row-first views-row-last views-row-odd views-row-even')
.filter(':first')
.addClass('views-row-first')
.end()
.filter(':last')
.addClass('views-row-last')
.end()
.filter(':even')
.addClass('views-row-odd')
.end()
.filter(':odd')
.addClass('views-row-even')
.end();
if (effect.showEffect != 'show') {
wrapper.find(content_query).children(':not(:visible)')[effect.showEffect](effect.showSpeed);
}
// Additional processing over new content
wrapper.trigger('views_load_more.new_content', new_content.clone());
// Attach all JavaScript behaviors to the new content
// Remove the Jquery once Class, TODO: There needs to be a better
// way of doing this, look at .removeOnce() :-/
var classes = wrapper.attr('class');
var onceClass = classes.match(/jquery-once-[0-9]*-[a-z]*/);
wrapper.removeClass(onceClass[0]);
settings = response.settings || ajax.settings || Drupal.settings;
Drupal.attachBehaviors(wrapper, settings);
};
/**
* Attaches the AJAX behavior to Views Load More waypoint support.
*/
Drupal.behaviors.ViewsLoadMore = {
attach: function (context, settings) {
var default_opts = {
offset: '100%'
};
if (settings && settings.viewsLoadMore && settings.views && settings.views.ajaxViews) {
$.each(settings.viewsLoadMore, function(i, setting) {
var view = '.view-id-' + setting.view_name + '.view-display-id-' + setting.view_display_id + ' .pager-next a',
opts = {};
$.extend(opts, default_opts, settings.viewsLoadMore[i].opts);
$(view).waypoint('destroy');
$(view).waypoint(function(event, direction) {
$(view).click();
}, opts);
});
}
},
detach: function (context, settings, trigger) {
if (settings && settings.viewsLoadMore && settings.views && settings.views.ajaxViews) {
$.each(settings.viewsLoadMore, function(i, setting) {
var view = '.view-id-' + setting.view_name + '.view-display-id-' + setting.view_display_id;
if ($(context).is(view)) {
$('.pager-next a', view).waypoint('destroy');
}
else {
$(view, context).waypoint('destroy');
}
});
}
}
};
})(jQuery);
;/*})'"*/
;/*})'"*/
/**
* @file
* Some basic behaviors and utility functions for Views.
*/
(function ($) {
Drupal.Views = {};
/**
* JQuery UI tabs, Views integration component.
*/
Drupal.behaviors.viewsTabs = {
attach: function (context) {
if ($.viewsUi && $.viewsUi.tabs) {
$('#views-tabset').once('views-processed').viewsTabs({
selectedClass: 'active'
});
}
$('a.views-remove-link').once('views-processed').click(function(event) {
var id = $(this).attr('id').replace('views-remove-link-', '');
$('#views-row-' + id).hide();
$('#views-removed-' + id).get(0).checked = true;
event.preventDefault();
});
// Here is to handle display deletion
// (checking in the hidden checkbox and hiding out the row).
$('a.display-remove-link')
.addClass('display-processed')
.click(function() {
var id = $(this).attr('id').replace('display-remove-link-', '');
$('#display-row-' + id).hide();
$('#display-removed-' + id).get(0).checked = true;
return false;
});
}
};
/**
* Helper function to parse a querystring.
*/
Drupal.Views.parseQueryString = function (query) {
var args = {};
var pos = query.indexOf('?');
if (pos != -1) {
query = query.substring(pos + 1);
}
var pairs = query.split('&');
for (var i in pairs) {
if (typeof(pairs[i]) == 'string') {
var pair = pairs[i].split('=');
// Ignore the 'q' path argument, if present.
if (pair[0] != 'q' && pair[1]) {
args[decodeURIComponent(pair[0].replace(/\+/g, ' '))] = decodeURIComponent(pair[1].replace(/\+/g, ' '));
}
}
}
return args;
};
/**
* Helper function to return a view's arguments based on a path.
*/
Drupal.Views.parseViewArgs = function (href, viewPath) {
// Provide language prefix.
if (Drupal.settings.pathPrefix) {
var viewPath = Drupal.settings.pathPrefix + viewPath;
}
var returnObj = {};
var path = Drupal.Views.getPath(href);
// Ensure there is a correct path.
if (viewPath && path.substring(0, viewPath.length + 1) == viewPath + '/') {
var args = decodeURIComponent(path.substring(viewPath.length + 1, path.length));
returnObj.view_args = args;
returnObj.view_path = path;
}
return returnObj;
};
/**
* Strip off the protocol plus domain from an href.
*/
Drupal.Views.pathPortion = function (href) {
// Remove e.g. http://example.com if present.
var protocol = window.location.protocol;
if (href.substring(0, protocol.length) == protocol) {
// 2 is the length of the '//' that normally follows the protocol.
href = href.substring(href.indexOf('/', protocol.length + 2));
}
return href;
};
/**
* Return the Drupal path portion of an href.
*/
Drupal.Views.getPath = function (href) {
href = Drupal.Views.pathPortion(href);
href = href.substring(Drupal.settings.basePath.length, href.length);
// 3 is the length of the '?q=' added to the URL without clean URLs.
if (href.substring(0, 3) == '?q=') {
href = href.substring(3, href.length);
}
var chars = ['#', '?', '&'];
for (var i in chars) {
if (href.indexOf(chars[i]) > -1) {
href = href.substr(0, href.indexOf(chars[i]));
}
}
return href;
};
})(jQuery);
;/*})'"*/
;/*})'"*/
(function ($) {
/**
* A progressbar object. Initialized with the given id. Must be inserted into
* the DOM afterwards through progressBar.element.
*
* method is the function which will perform the HTTP request to get the
* progress bar state. Either "GET" or "POST".
*
* e.g. pb = new progressBar('myProgressBar');
* some_element.appendChild(pb.element);
*/
Drupal.progressBar = function (id, updateCallback, method, errorCallback) {
var pb = this;
this.id = id;
this.method = method || 'GET';
this.updateCallback = updateCallback;
this.errorCallback = errorCallback;
// The WAI-ARIA setting aria-live="polite" will announce changes after users
// have completed their current activity and not interrupt the screen reader.
this.element = $('');
this.element.html('' +
'' +
'
');
};
/**
* Set the percentage and status message for the progressbar.
*/
Drupal.progressBar.prototype.setProgress = function (percentage, message) {
if (percentage >= 0 && percentage <= 100) {
$('div.progress-bar', this.element).css('width', percentage + '%');
$('div.progress-bar', this.element).attr('aria-valuenow', percentage);
$('div.percentage', this.element).html(percentage + '%');
}
$('div.message', this.element).html(message);
if (this.updateCallback) {
this.updateCallback(percentage, message, this);
}
};
/**
* Start monitoring progress via Ajax.
*/
Drupal.progressBar.prototype.startMonitoring = function (uri, delay) {
this.delay = delay;
this.uri = uri;
this.sendPing();
};
/**
* Stop monitoring progress via Ajax.
*/
Drupal.progressBar.prototype.stopMonitoring = function () {
clearTimeout(this.timer);
// This allows monitoring to be stopped from within the callback.
this.uri = null;
};
/**
* Request progress data from server.
*/
Drupal.progressBar.prototype.sendPing = function () {
if (this.timer) {
clearTimeout(this.timer);
}
if (this.uri) {
var pb = this;
// When doing a post request, you need non-null data. Otherwise a
// HTTP 411 or HTTP 406 (with Apache mod_security) error may result.
$.ajax({
type: this.method,
url: this.uri,
data: '',
dataType: 'json',
success: function (progress) {
// Display errors.
if (progress.status == 0) {
pb.displayError(progress.data);
return;
}
// Update display.
pb.setProgress(progress.percentage, progress.message);
// Schedule next timer.
pb.timer = setTimeout(function () { pb.sendPing(); }, pb.delay);
},
error: function (xmlhttp) {
pb.displayError(Drupal.ajaxError(xmlhttp, pb.uri));
}
});
}
};
/**
* Display errors on the page.
*/
Drupal.progressBar.prototype.displayError = function (string) {
var error = $('').append(string);
$(this.element).before(error).hide();
if (this.errorCallback) {
this.errorCallback(this);
}
};
})(jQuery);
;/*})'"*/
;/*})'"*/
/**
* @file
* Handles AJAX fetching of views, including filter submission and response.
*/
(function ($) {
/**
* Attaches the AJAX behavior to exposed filter forms and key views links.
*/
Drupal.behaviors.ViewsAjaxView = {};
Drupal.behaviors.ViewsAjaxView.attach = function() {
if (Drupal.settings && Drupal.settings.views && Drupal.settings.views.ajaxViews) {
$.each(Drupal.settings.views.ajaxViews, function(i, settings) {
Drupal.views.instances[i] = new Drupal.views.ajaxView(settings);
});
}
};
Drupal.views = {};
Drupal.views.instances = {};
/**
* JavaScript object for a certain view.
*/
Drupal.views.ajaxView = function(settings) {
var selector = '.view-dom-id-' + settings.view_dom_id;
this.$view = $(selector);
// If view is not present return to prevent errors.
if (!this.$view.length) {
return;
}
// Retrieve the path to use for views' ajax.
var ajax_path = Drupal.settings.views.ajax_path;
// If there are multiple views this might've ended up showing up multiple
// times.
if (ajax_path.constructor.toString().indexOf("Array") != -1) {
ajax_path = ajax_path[0];
}
// Check if there are any GET parameters to send to views.
var queryString = window.location.search || '';
if (queryString !== '') {
// Remove the question mark and Drupal path component if any.
var queryString = queryString.slice(1).replace(/q=[^&]+&?|&?render=[^&]+/, '');
if (queryString !== '') {
// If there is a '?' in ajax_path, clean url are on and & should be
// used to add parameters.
queryString = ((/\?/.test(ajax_path)) ? '&' : '?') + queryString;
}
}
this.element_settings = {
url: ajax_path + queryString,
submit: settings,
setClick: true,
event: 'click',
selector: selector,
progress: {
type: 'throbber'
}
};
this.settings = settings;
// Add the ajax to exposed forms.
this.$exposed_form = $('#views-exposed-form-' + settings.view_name.replace(/_/g, '-') + '-' + settings.view_display_id.replace(/_/g, '-'));
this.$exposed_form.once(jQuery.proxy(this.attachExposedFormAjax, this));
// Store Drupal.ajax objects here for all pager links.
this.links = [];
// Add the ajax to pagers.
this.$view
.once(jQuery.proxy(this.attachPagerAjax, this));
// Add a trigger to update this view specifically. In order to trigger a
// refresh use the following code.
//
// @code
// jQuery('.view-name').trigger('RefreshView');
// @endcode
// Add a trigger to update this view specifically.
var self_settings = this.element_settings;
self_settings.event = 'RefreshView';
var self = this;
this.$view.once('refresh', function () {
self.refreshViewAjax = new Drupal.ajax(self.selector, self.$view, self_settings);
});
};
Drupal.views.ajaxView.prototype.attachExposedFormAjax = function() {
var button = $('input[type=submit], button[type=submit], input[type=image]', this.$exposed_form);
button = button[0];
// Call the autocomplete submit before doing AJAX.
$(button).click(function () {
if (Drupal.autocompleteSubmit) {
Drupal.autocompleteSubmit();
}
});
this.exposedFormAjax = new Drupal.ajax($(button).attr('id'), button, this.element_settings);
};
/**
* Attach the ajax behavior to each link.
*/
Drupal.views.ajaxView.prototype.attachPagerAjax = function() {
this.$view.find('ul.pager > li > a, ol.pager > li > a, th.views-field a, .attachment .views-summary a')
.each(jQuery.proxy(this.attachPagerLinkAjax, this));
};
/**
* Attach the ajax behavior to a single link.
*/
Drupal.views.ajaxView.prototype.attachPagerLinkAjax = function(id, link) {
var $link = $(link);
var viewData = {};
var href = $link.attr('href');
// Don't attach to pagers inside nested views.
if ($link.closest('.view')[0] !== this.$view[0] &&
$link.closest('.view').parent().hasClass('attachment') === false) {
return;
}
// Provide a default page if none has been set. This must be done
// prior to merging with settings to avoid accidentally using the
// page landed on instead of page 1.
if (typeof(viewData.page) === 'undefined') {
viewData.page = 0;
}
// Construct an object using the settings defaults and then overriding
// with data specific to the link.
$.extend(
viewData,
this.settings,
Drupal.Views.parseQueryString(href),
// Extract argument data from the URL.
Drupal.Views.parseViewArgs(href, this.settings.view_base_path)
);
// For anchor tags, these will go to the target of the anchor rather
// than the usual location.
$.extend(viewData, Drupal.Views.parseViewArgs(href, this.settings.view_base_path));
// Construct an object using the element settings defaults,
// then overriding submit with viewData.
var pager_settings = $.extend({}, this.element_settings);
pager_settings.submit = viewData;
this.pagerAjax = new Drupal.ajax(false, $link, pager_settings);
this.links.push(this.pagerAjax);
};
Drupal.ajax.prototype.commands.viewsScrollTop = function (ajax, response, status) {
// Scroll to the top of the view. This will allow users
// to browse newly loaded content after e.g. clicking a pager
// link.
var offset = $(response.selector).offset();
// We can't guarantee that the scrollable object should be
// the body, as the view could be embedded in something
// more complex such as a modal popup. Recurse up the DOM
// and scroll the first element that has a non-zero top.
var scrollTarget = response.selector;
while ($(scrollTarget).scrollTop() == 0 && $(scrollTarget).parent()) {
scrollTarget = $(scrollTarget).parent();
}
// Only scroll upward.
if (offset.top - 10 < $(scrollTarget).scrollTop()) {
$(scrollTarget).animate({scrollTop: (offset.top - 10)}, 500);
}
};
})(jQuery);
;/*})'"*/
;/*})'"*/
/**
* @file better_exposed_filters.js
*
* Provides some client-side functionality for the Better Exposed Filters module
*/
(function ($) {
Drupal.behaviors.betterExposedFilters = {
attach: function(context) {
// Add highlight class to checked checkboxes for better theming
$('.bef-tree input[type=checkbox], .bef-checkboxes input[type=checkbox]')
// Highlight newly selected checkboxes
.change(function() {
_bef_highlight(this, context);
})
.filter(':checked').closest('.form-item', context).addClass('highlight')
;
}
};
Drupal.behaviors.betterExposedFiltersSelectAllNone = {
attach: function(context) {
/*
* Add Select all/none links to specified checkboxes
*/
var selected = $('.form-checkboxes.bef-select-all-none:not(.bef-processed)');
if (selected.length) {
var selAll = Drupal.t('Select All');
var selNone = Drupal.t('Select None');
// Set up a prototype link and event handlers
var link = $(''+ selAll +'')
link.click(function(event) {
// Don't actually follow the link...
event.preventDefault();
event.stopPropagation();
if (selAll == $(this).text()) {
// Select all the checkboxes
$(this)
.html(selNone)
.siblings('.bef-checkboxes, .bef-tree')
.find('.form-item input:checkbox').each(function() {
$(this).attr('checked', true);
_bef_highlight(this, context);
})
.end()
// attr() doesn't trigger a change event, so we do it ourselves. But just on
// one checkbox otherwise we have many spinning cursors
.find('input[type=checkbox]:first').change()
;
}
else {
// Unselect all the checkboxes
$(this)
.html(selAll)
.siblings('.bef-checkboxes, .bef-tree')
.find('.form-item input:checkbox').each(function() {
$(this).attr('checked', false);
_bef_highlight(this, context);
})
.end()
// attr() doesn't trigger a change event, so we do it ourselves. But just on
// one checkbox otherwise we have many spinning cursors
.find('input[type=checkbox]:first').change()
;
}
});
// Add link to the page for each set of checkboxes.
selected
.addClass('bef-processed')
.each(function(index) {
// Clone the link prototype and insert into the DOM
var newLink = link.clone(true);
newLink.insertBefore($('.bef-checkboxes, .bef-tree', this));
// If all checkboxes are already checked by default then switch to Select None
if ($('input:checkbox:checked', this).length == $('input:checkbox', this).length) {
newLink.click();
}
})
;
}
// Check for and initialize datepickers
var befSettings = Drupal.settings.better_exposed_filters;
if (befSettings && befSettings.datepicker && befSettings.datepicker_options && $.fn.datepicker) {
var opt = [];
$.each(befSettings.datepicker_options, function(key, val) {
if (key && val) {
opt[key] = JSON.parse(val);
}
});
$('.bef-datepicker').datepicker(opt);
}
} // attach: function() {
}; // Drupal.behaviors.better_exposed_filters = {
Drupal.behaviors.betterExposedFiltersAllNoneNested = {
attach:function (context, settings) {
$('.form-checkboxes.bef-select-all-none-nested li').has('ul').once('bef-all-none-nested', function () {
$(this)
// To respect term depth, check/uncheck child term checkboxes.
.find('input.form-checkboxes:first')
.click(function() {
var checkedParent = $(this).attr('checked');
if (!checkedParent) {
// Uncheck all children if parent is unchecked.
$(this).parents('li:first').find('ul input.form-checkboxes').removeAttr('checked');
}
else {
// Check all children if parent is checked.
$(this).parents('li:first').find('ul input.form-checkboxes').attr('checked', $(this).attr('checked'));
}
})
.end()
// When a child term is checked or unchecked, set the parent term's
// status.
.find('ul input.form-checkboxes')
.click(function() {
var checked = $(this).attr('checked');
// Determine the number of unchecked sibling checkboxes.
var ct = $(this).parents('ul:first').find('input.form-checkboxes:not(:checked)').size();
// If the child term is unchecked, uncheck the parent.
if (!checked) {
// Uncheck parent if any of the childres is unchecked.
$(this).parents('li:first').parents('li:first').find('input.form-checkboxes:first').removeAttr('checked');
}
// If all sibling terms are checked, check the parent.
if (!ct) {
// Check the parent if all the children are checked.
$(this).parents('li:first').parents('li:first').find('input.form-checkboxes:first').attr('checked', checked);
}
});
});
}
};
Drupal.behaviors.better_exposed_filters_slider = {
attach: function(context, settings) {
var befSettings = settings.better_exposed_filters;
if (befSettings && befSettings.slider && befSettings.slider_options) {
$.each(befSettings.slider_options, function(i, sliderOptions) {
var containing_parent = "#" + sliderOptions.viewId + " #edit-" + sliderOptions.id + "-wrapper .views-widget";
var $filter = $(containing_parent);
// If the filter is placed in a secondary fieldset, we may not have
// the usual wrapper element.
if (!$filter.length) {
containing_parent = "#" + sliderOptions.viewId + " .bef-slider-wrapper";
$filter = $(containing_parent);
}
// Only make one slider per filter.
$filter.once('slider-filter', function() {
var $input = $(this).find('input[type=text]');
// This is a "between" or "not between" filter with two values.
if ($input.length == 2) {
var $min = $input.parent().find('input#edit-' + sliderOptions.id + '-min'),
$max = $input.parent().find('input#edit-' + sliderOptions.id + '-max'),
default_min,
default_max;
if (!$min.length || !$max.length) {
return;
}
// Get the default values.
// We use slider min & max if there are no defaults.
default_min = parseFloat(($min.val() == '') ? sliderOptions.min : $min.val(), 10);
default_max = parseFloat(($max.val() == '') ? sliderOptions.max : $max.val(), 10);
// Set the element value in case we are using the slider min & max.
$min.val(default_min);
$max.val(default_max);
$min.parents(containing_parent).after(
$('').slider({
range: true,
min: parseFloat(sliderOptions.min, 10),
max: parseFloat(sliderOptions.max, 10),
step: parseFloat(sliderOptions.step, 10),
animate: sliderOptions.animate ? sliderOptions.animate : false,
orientation: sliderOptions.orientation,
values: [default_min, default_max],
// Update the textfields as the sliders are moved
slide: function (event, ui) {
$min.val(ui.values[0]);
$max.val(ui.values[1]);
},
// This fires when the value is set programmatically or the
// stop event fires.
// This takes care of the case that a user enters a value
// into the text field that is not a valid step of the slider.
// In that case the slider will go to the nearest step and
// this change event will update the text area.
change: function (event, ui) {
$min.val(ui.values[0]);
$max.val(ui.values[1]);
},
// Attach stop listeners.
stop: function(event, ui) {
// Click the auto submit button.
$(this).parents('form').find('.ctools-auto-submit-click').click();
}
})
);
// Update the slider when the fields are updated.
$min.blur(function() {
befUpdateSlider($(this), 0, sliderOptions);
});
$max.blur(function() {
befUpdateSlider($(this), 1, sliderOptions);
});
}
// This is single value filter.
else if ($input.length == 1) {
if ($input.attr('id') != 'edit-' + sliderOptions.id) {
return;
}
// Get the default value. We use slider min if there is no default.
var default_value = parseFloat(($input.val() == '') ? sliderOptions.min : $input.val(), 10);
// Set the element value in case we are using the slider min.
$input.val(default_value);
$input.parents(containing_parent).after(
$('').slider({
min: parseFloat(sliderOptions.min, 10),
max: parseFloat(sliderOptions.max, 10),
step: parseFloat(sliderOptions.step, 10),
animate: sliderOptions.animate ? sliderOptions.animate : false,
orientation: sliderOptions.orientation,
value: default_value,
// Update the textfields as the sliders are moved.
slide: function (event, ui) {
$input.val(ui.value);
},
// This fires when the value is set programmatically or the
// stop event fires.
// This takes care of the case that a user enters a value
// into the text field that is not a valid step of the slider.
// In that case the slider will go to the nearest step and
// this change event will update the text area.
change: function (event, ui) {
$input.val(ui.value);
},
// Attach stop listeners.
stop: function(event, ui) {
// Click the auto submit button.
$(this).parents('form').find('.ctools-auto-submit-click').click();
}
})
);
// Update the slider when the field is updated.
$input.blur(function() {
befUpdateSlider($(this), null, sliderOptions);
});
}
else {
return;
}
})
});
}
}
};
// This is only needed to provide ajax functionality
Drupal.behaviors.better_exposed_filters_select_as_links = {
attach: function(context, settings) {
$('.bef-select-as-links', context).once(function() {
var $element = $(this);
// Check if ajax submission is enabled. If it's not enabled then we
// don't need to attach our custom submission handling, because the
// links are already properly built.
// First check if any ajax views are contained in the current page.
if (typeof settings.views == 'undefined' || typeof settings.views.ajaxViews == 'undefined') {
return;
}
// Now check that the view for which the current filter block is used,
// is part of the configured ajax views.
var $uses_ajax = false;
$.each(settings.views.ajaxViews, function(i, item) {
var $view_name = item.view_name.replace(/_/g, '-');
var $view_display_id = item.view_display_id.replace(/_/g, '-');
var $id = 'views-exposed-form-' + $view_name + '-' + $view_display_id;
var $form_id = $element.parents('form').attr('id');
if ($form_id == $id) {
$uses_ajax = true;
return;
}
});
// If no ajax is used for form submission, we quit here.
if (!$uses_ajax) {
return;
}
// Attach selection toggle and form submit on click to each link.
$(this).find('a').click(function(event) {
var $wrapper = $(this).parents('.bef-select-as-links');
var $options = $wrapper.find('select option');
// We have to prevent the page load triggered by the links.
event.preventDefault();
event.stopPropagation();
// Un select if previously seleted toogle is selected.
var link_text = $(this).text();
removed = '';
$($options).each(function(i) {
if ($(this).attr('selected')) {
if (link_text == $(this).text()) {
removed = $(this).text();
$(this).removeAttr('selected');
}
}
});
// Set the corresponding option inside the select element as selected.
$selected = $options.filter(function() {
return $(this).text() == link_text && removed != link_text;
});
$selected.attr('selected', 'selected');
$wrapper.find('.bef-new-value').val($selected.val());
$wrapper.find('.bef-new-value[value=""]').attr("disabled", "disabled");
$(this).addClass('active');
// Submit the form.
$wrapper.parents('form').find('.views-submit-button *[type=submit]').click();
});
$('.bef-select-as-link').ready(function() {
$('.bef-select-as-link').find('a').removeClass('active');
$('.bef-new-value').each(function(i, val) {
id = $(this).parent().find('select').attr('id') + '-' + $(this).val();
$('#'+id).find('a').addClass('active');
});
});
});
}
};
Drupal.behaviors.betterExposedFiltersRequiredFilter = {
attach: function(context, settings) {
// Required checkboxes should re-check all inputs if a user un-checks
// them all.
$('.bef-select-as-checkboxes', context).once('bef-required-filter').ajaxComplete(function (e, xhr, s) {
var $element = $(this);
if (typeof settings.views == 'undefined' || typeof settings.views.ajaxViews == 'undefined') {
return;
}
// Now check that the view for which the current filter block is used,
// is part of the configured ajax views.
var $view_name;
var $view_display_id;
var $uses_ajax = false;
$.each(settings.views.ajaxViews, function(i, item) {
$view_name = item.view_name;
$view_display_id = item.view_display_id;
var $id = 'views-exposed-form-' + $view_name.replace(/_/g, '-') + '-' + $view_display_id.replace(/_/g, '-');
var $form_id = $element.parents('form').attr('id');
if ($form_id == $id) {
$uses_ajax = true;
return false;
}
});
//Check if we have any filters at all because of Views Selective Filter
if($('input', this).length > 0) {
var $filter_name = $('input', this).attr('name').slice(0, -2);
if (Drupal.settings.better_exposed_filters.views[$view_name].displays[$view_display_id].filters[$filter_name].required && $('input:checked', this).length == 0) {
$('input', this).prop('checked', true);
}
}
});
}
}
/*
* Helper functions
*/
/**
* Adds/Removes the highlight class from the form-item div as appropriate
*/
function _bef_highlight(elem, context) {
$elem = $(elem, context);
$elem.attr('checked')
? $elem.closest('.form-item', context).addClass('highlight')
: $elem.closest('.form-item', context).removeClass('highlight');
}
/**
* Update a slider when a related input element is changed.
*
* We don't need to check whether the new value is valid based on slider min,
* max, and step because the slider will do that automatically and then we
* update the textfield on the slider's change event.
*
* We still have to make sure that the min & max values of a range slider
* don't pass each other though, however once this jQuery UI bug is fixed we
* won't have to. - http://bugs.jqueryui.com/ticket/3762
*
* @param $el
* A jQuery object of the updated element.
* @param valIndex
* The index of the value for a range slider or null for a non-range slider.
* @param sliderOptions
* The options for the current slider.
*/
function befUpdateSlider($el, valIndex, sliderOptions) {
var val = parseFloat($el.val(), 10),
currentMin = $el.parents('div.views-widget').next('.bef-slider').slider('values', 0),
currentMax = $el.parents('div.views-widget').next('.bef-slider').slider('values', 1);
// If we have a range slider.
if (valIndex != null) {
// Make sure the min is not more than the current max value.
if (valIndex == 0 && val > currentMax) {
val = currentMax;
}
// Make sure the max is not more than the current max value.
if (valIndex == 1 && val < currentMin) {
val = currentMin;
}
// If the number is invalid, go back to the last value.
if (isNaN(val)) {
val = $el.parents('div.views-widget').next('.bef-slider').slider('values', valIndex);
}
}
else {
// If the number is invalid, go back to the last value.
if (isNaN(val)) {
val = $el.parents('div.views-widget').next('.bef-slider').slider('value');
}
}
// Make sure we are a number again.
val = parseFloat(val, 10);
// Set the slider to the new value.
// The slider's change event will then update the textfield again so that
// they both have the same value.
if (valIndex != null) {
$el.parents('div.views-widget').next('.bef-slider').slider('values', valIndex, val);
}
else {
$el.parents('div.views-widget').next('.bef-slider').slider('value', val);
}
}
}) (jQuery);
;/*})'"*/
;/*})'"*/
(function ($) {
"use strict";
Drupal.behaviors.entityreference_filter_dynamic = {
attach: function (context, settings) {
if (settings.entityreference_filter) {
$.each(settings.entityreference_filter, function(form_id, filter_setting) {
var form = $('#' + form_id, context);
if (form.length === 0) {
return;
}
var view = filter_setting.view;
var args = filter_setting.args;
var dependent_filters = filter_setting.dynamic;
var elements = {};
var controlling_filters = {};
if (dependent_filters) {
$.each(dependent_filters, function(i, dep_controlling_filters) {
$.each(dep_controlling_filters, function(j, controlling_filter) {
controlling_filters[controlling_filter] = controlling_filter;
});
});
}
$.each(controlling_filters, function(i, controlling_filter) {
var element = form.find('[name="' + controlling_filter + '"],[name="' + controlling_filter + '[]"]');
if (element.length > 0) {
elements[controlling_filter] = element;
element.attr('autocomplete', 'off');
var url = settings.basePath + settings.pathPrefix + 'entityreference_filter/update/' + view + '/' + controlling_filter;
element.once('entityreference_filter').change(function() {
var ajax = new Drupal.ajax(false, false, {url: url});
var parentBeforeSerialize = ajax.beforeSerialize;
ajax.beforeSerialize = function(element, options) {
parentBeforeSerialize(element, options);
options.type = 'GET';
options.data = {};
$.each(elements, function(fn, element) {
var value = element.fieldValue();
if (value.length > 0) {
options.data[fn] = value[0];
}
});
options.data.entityreference_filter_form_id = form_id;
options.data.entityreference_filter_args = args;
};
ajax.eventResponse(ajax, {});
});
// Another way.
//var ajax = new Drupal.ajax(false, element, {event: 'change', url: url});
//var parentBeforeSerialize = ajax.beforeSerialize;
//ajax.beforeSerialize = function(element, options) {
// parentBeforeSerialize(element, options);
// options.type = 'GET';
// options.data = {};
//
// $.each(elements, function(fn, element) {
// var value = element.fieldValue();
// if (value.length > 0) {
// options.data[fn] = value[0];
// }
// });
//
// options.data['entityreference_filter_form_id'] = form_id;
// options.data['entityreference_filter_args'] = args;
//};
}
});
});
}
}
};
/**
* Command to insert new content into the DOM without wrapping in extra DIV element.
*/
Drupal.ajax.prototype.commands.entityreference_filter_insertnowrap = function (ajax, response, status) {
// Get information from the response. If it is not there, default to
// our presets.
var wrapper = response.selector ? $(response.selector) : $(ajax.wrapper);
var method = response.method || ajax.method;
var effect = ajax.getEffect(response);
// We don't know what response.data contains: it might be a string of text
// without HTML, so don't rely on jQuery correctly interpreting
// $(response.data) as new HTML rather than a CSS selector. Also, if
// response.data contains top-level text nodes, they get lost with either
// $(response.data) or $('').replaceWith(response.data).
var new_content_wrapped = $('').html(response.data);
var new_content = new_content_wrapped.contents();
var settings = {};
// If removing content from the wrapper, detach behaviors first.
switch (method) {
case 'html':
case 'replaceWith':
case 'replaceAll':
case 'empty':
case 'remove':
settings = response.settings || ajax.settings || Drupal.settings;
Drupal.detachBehaviors(wrapper, settings);
break;
}
// Add the new content to the page.
wrapper[method](new_content);
// Immediately hide the new content if we're using any effects.
if (effect.showEffect !== 'show') {
new_content.hide();
}
// Determine which effect to use and what content will receive the
// effect, then show the new content.
if ($('.ajax-new-content', new_content).length > 0) {
$('.ajax-new-content', new_content).hide();
new_content.show();
$('.ajax-new-content', new_content)[effect.showEffect](effect.showSpeed);
}
else if (effect.showEffect !== 'show') {
new_content[effect.showEffect](effect.showSpeed);
}
// Attach all JavaScript behaviors to the new content, if it was successfully
// added to the page, this if statement allows #ajax['wrapper'] to be
// optional.
if (new_content.parents('html').length > 0) {
// Apply any settings from the returned JSON if available.
settings = response.settings || ajax.settings || Drupal.settings;
Drupal.attachBehaviors(wrapper, settings);
}
};
})(jQuery);
;/*})'"*/
;/*})'"*/
(function ($) {
$(document).ready(function() {
// Attach mousedown, keyup, touchstart events to document only and catch
// clicks on all elements.
$(document.body).bind("mousedown keyup touchstart", function(event) {
// Catch the closest surrounding link of a clicked element.
$(event.target).closest("a,area").each(function() {
if (Drupal.settings.piwik.trackMailto && $(this).is("a[href^='mailto:'],area[href^='mailto:']")) {
// Mailto link clicked.
_paq.push(["trackEvent", "Mails", "Click", this.href.substring(7)]);
}
});
});
// Colorbox: This event triggers when the transition has completed and the
// newly loaded content has been revealed.
if (Drupal.settings.piwik.trackColorbox) {
$(document).bind("cbox_complete", function () {
var href = $.colorbox.element().attr("href");
if (href) {
_paq.push(["setCustomUrl", href]);
_paq.push(["trackPageView"]);
}
});
}
});
})(jQuery);
;/*})'"*/
;/*})'"*/