(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) { $('.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 }; $.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; // Lets add our colorbox link after the base path if necessary. var base_path = Drupal.settings.basePath; 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 (base_path != '/') { var link = pathname.replace(base_path, base_path + 'colorbox/') + parse.search; } else { var link = base_path + '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 () { $this = $(this); // 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); } 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 something wonky with galleries. var rel = $(this).attr('rel'); if ($('a[rel="' + rel + '"]:not("#colorbox a[rel="' + rel + '"]")').length > 1) { $related = $('a[rel="' + rel + '"]:not("#colorbox a[rel="' + rel + '"]")'); var idx = $related.index($(this)); 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(); 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; } } // 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}; }; })(jQuery);