(function ($) { Drupal.behaviors.colorboxNode = { // Lets find our class name and change our URL to // our defined menu path to open in a colorbox modal. attach: function (context, settings) { // Make sure colorbox exists. if (!$.isFunction($.colorbox) || typeof settings.colorbox === 'undefined') { return; } // Mobile detection extracted from the colorbox module. // If the mobile setting is turned on, it will turn off the colorbox modal for mobile devices. if (settings.colorbox.mobiledetect && window.matchMedia) { // Disable Colorbox for small screens. var mq = window.matchMedia("(max-device-width: " + settings.colorbox.mobiledevicewidth + ")"); if (mq.matches) { return; } } $('.colorbox-node', context).once('init-colorbox-node-processed', function () { $(this).colorboxNode({'launch': false}); }); // When using contextual links and clicking from within the colorbox // we need to close down colorbox when opening the built in overlay. $('ul.contextual-links a', context).once('colorboxNodeContextual').click(function () { $.colorbox.close(); }); } }; // Bind our colorbox node functionality to an anchor $.fn.colorboxNode = function (options) { var settings = { 'launch': true, 'width': Drupal.settings.colorbox_node.width, 'height': Drupal.settings.colorbox_node.height }; $.extend(settings, options); var href = $(this).attr('data-href'); if (typeof href == 'undefined' || href == false) { href = $(this).attr('href'); } // Create an element so we can parse our a URL no matter if its internal or external. var parse = document.createElement('a'); parse.href = href; if(!href) { alert(Drupal.t('No url found on element')); } // Lets add our colorbox link after the base path if necessary. var base_path = Drupal.settings.basePath; var path_prefix = Drupal.settings.pathPrefix; var pathname = parse.pathname; // Lets check to see if the pathname has a forward slash. // This problem happens in IE7/IE8 if (pathname.charAt(0) != '/') { pathname = '/' + parse.pathname; } // If clean URL's are not turned on, lets check for that. var url = $.getParameterByName('q', href); if (base_path != '/') { if (url != '') { var link = pathname.replace(base_path, base_path + parse.search.replace('?q=', '?q=/' + path_prefix + 'colorbox/')); } else { var link = pathname.replace(base_path, base_path + path_prefix + 'colorbox/') + parse.search; } } else { if (url != '') { var link = base_path + parse.search.replace('?q=', '?q=/' + path_prefix + 'colorbox/'); } else { var link = base_path + path_prefix + 'colorbox' + pathname + parse.search; } } // Bind Ajax behaviors to all items showing the class. var element_settings = {}; // This removes any loading/progress bar on the clicked link // and displays the colorbox loading screen instead. element_settings.progress = { 'type': 'none' }; // For anchor tags, these will go to the target of the anchor rather // than the usual location. if (href) { element_settings.url = link; element_settings.event = 'click'; } $(this).click(function () { var $this = $(this).clone(); // Clear out the rel to prevent any confusion if not using the gallery class. if(!$this.hasClass('colorbox-node-gallery')) { $this.attr('rel', ''); } // Lets extract our width and height giving priority to the data attributes. var innerWidth = $this.data('inner-width'); var innerHeight = $this.data('inner-height'); if (typeof innerWidth != 'undefined' && typeof innerHeight != 'undefined') { var params = $.urlDataParams(innerWidth, innerHeight); } else { var params = $.urlParams(href); } // If we did not find a width or height, lets use the default. if (params.innerHeight == undefined) params.innerHeight = settings.height; if (params.innerWidth == undefined) params.innerWidth = settings.width; params.html = '
'; params.onComplete = function () { $this.colorboxNodeGroup(); } params.open = true; // Launch our colorbox with the provided settings $this.colorbox($.extend({}, Drupal.settings.colorbox, params)); }); // Log our click handler to our ajax object var base = $(this).attr('id'); Drupal.ajax[base] = new Drupal.ajax(base, this, element_settings); // Default to auto click for manual call to this function. if (settings.launch) { Drupal.ajax[base].eventResponse(this, 'click'); $(this).click(); } } // Allow for grouping on links to showcase a gallery with left/right arrows. // This function will find the next index of each link on the page by the rel // and manually force a click on the link to call that AJAX and update the // modal window. $.fn.colorboxNodeGroup = function () { // Lets do setup our gallery type of functions. var $this = $(this); var rel = $this.attr('rel'); if(rel && $this.hasClass('colorbox-node-gallery')) { if ($('a.colorbox-node-gallery[rel="' + rel + '"]:not("#colorbox a[rel="' + rel + '"]")').length > 1) { $related = $('a.colorbox-node-gallery[rel="' + rel + '"]:not("#colorbox a[rel="' + rel + '"]")'); // filter $related array by href, to have mutliple colorbox links to the same target // appear as one item in the gallery only var $related_unique = []; $related.each(function() { $.findHref($related_unique, this.href); if (!$.findHref($related_unique, this.href).length) { $related_unique.push(this); } }); // we have to get the actual used element from the filtered list in order to get it's relative index var current = $.findHref($related_unique, $this.get(0).href); $related = $($related_unique); var idx = $related.index($(current)); var tot = $related.length; // Show our gallery buttons $('#cboxPrevious, #cboxNext').show(); $.colorbox.next = function () { index = getIndex(1); $related[index].click(); }; $.colorbox.prev = function () { index = getIndex(-1); $related[index].click(); }; // Setup our current HTML $('#cboxCurrent').html(Drupal.settings.colorbox.current.replace('{current}', idx + 1).replace('{total}', tot)).show(); $('#cboxNext').html(Drupal.settings.colorbox.next).show(); $('#cboxPrevious').html(Drupal.settings.colorbox.previous).show(); var prefix = 'colorbox'; // Remove Bindings and re-add // @TODO: There must be a better way? If we don't remove it causes a memory to be exhausted. $(document).unbind('keydown.' + prefix); // Add Key Bindings $(document).bind('keydown.' + prefix, function (e) { var key = e.keyCode; if ($related[1] && !e.altKey) { if (key === 37) { e.preventDefault(); $.colorbox.prev(); } else if (key === 39) { e.preventDefault(); $.colorbox.next(); } } }); } function getIndex(increment) { var max = $related.length; var newIndex = (idx + increment) % max; return (newIndex < 0) ? max + newIndex : newIndex; } } } // Find a colorbox link by href in an array $.findHref = function(items, href) { return $.grep(items, function(n, i){ return n.href == href; }); }; // Utility function to parse out our width/height from our url params $.urlParams = function (url) { var p = {}, e, a = /\+/g, // Regex for replacing addition symbol with a space r = /([^&=]+)=?([^&]*)/g, d = function (s) { return decodeURIComponent(s.replace(a, ' ')); }, q = url.split('?'); while (e = r.exec(q[1])) { e[1] = d(e[1]); e[2] = d(e[2]); switch (e[2].toLowerCase()) { case 'true': case 'yes': e[2] = true; break; case 'false': case 'no': e[2] = false; break; } if (e[1] == 'width') { e[1] = 'innerWidth'; } if (e[1] == 'height') { e[1] = 'innerHeight'; } p[e[1]] = e[2]; } return p; }; // Utility function to return our data attributes for width/height $.urlDataParams = function (innerWidth, innerHeight) { return {'innerWidth':innerWidth,'innerHeight':innerHeight}; }; $.getParameterByName = function(name, href) { name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); var regexString = "[\\?&]" + name + "=([^&#]*)"; var regex = new RegExp(regexString); var found = regex.exec(href); if(found == null) return ""; else return decodeURIComponent(found[1].replace(/\+/g, " ")); } })(jQuery);