/(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 = $('
×

Error message

').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); ;/*})'"*/ ;/*})'"*/