jQuery(function($) { jQuery.fn.catablogLightbox = function(config) { // PlugIn Variables var size = this.size(); var settings = {'size': size}; if (config) jQuery.extend(settings, config); var timeout = null; var image_extensions = ['jpg', 'jpeg', 'gif', 'png']; var hold_click = false; var lightbox_images = []; var current_image = -1; // PlugIn Construction applied across each selected jQuery object this.each(function(i) { lightbox_images[i] = this; if (jQuery(this).get(0).nodeName.toLowerCase() == "a") { // selected element is an achor tag var href = jQuery(this).attr('href'); var extension = href.split('.').pop().toLowerCase(); if (in_array(extension, image_extensions)) { jQuery(this).bind('click', function(event) { current_image = i; open_lightbox(lightbox_images[i]); jQuery('.catablog-selected').removeClass('catablog-selected'); jQuery(this).addClass('catablog-selected'); event.stopPropagation(); return false; }); } } else if (jQuery(this).get(0).nodeName.toLowerCase() == "img") { // selected element is an image tag if (typeof(console) !== 'undefined' && console != null) { console.log('You are using the CataBlog LightBox in an incorrect way, please set the lightbox selector to point at anchor tags surrounding your thumbnail images.'); } jQuery(this).css('cursor','pointer').bind('click', function(event) { current_image = i; open_lightbox(lightbox_images[i]); jQuery('.catablog-selected').removeClass('catablog-selected'); jQuery(this).addClass('catablog-selected'); event.stopPropagation(); return false; }); } else { // selected element is of an unsupported tag type if (typeof(console) !== 'undefined' && console != null) { console.log('You are using the CataBlog LightBox in an incorrect way, please set the lightbox selector to point at anchor tags surrounding your thumbnail images.'); } } }); // Private Functions function open_lightbox(element) { var support_fixed = supportPositionFixed(); var curtain_density = 0.85; var fadein_speed = 0; var page_top = jQuery(document).scrollTop() + 30; // add the curtain div into the DOM jQuery('body').append("
 
"); var curtain = jQuery('#catablog-curtain'); // bind the curtain click and fade the curtain into view curtain.bind('click', function() { close_lightbox(); }); curtain.css('opacity', curtain_density); if (!support_fixed) { var window_height = jQuery(window).height(); var document_height = jQuery(document).height(); curtain.css('position', 'absolute'); curtain.height(document_height); } // add the lightbox div into the DOM jQuery('body').append("
"); var lightbox = jQuery('#catablog-lightbox'); lightbox.css('top', page_top); // MAKE NOTE HERE lightbox.bind('click', function() { close_lightbox(); }); jQuery('#catablog-whiteboard').bind('click', function(event) { event.stopPropagation(); // do not return false, break a:links in whiteboard }); lightbox.show(); load_catablog_image(element); } function load_catablog_image(element) { var load_attempts = 0; var fullsize_pic = new Image(); fullsize_pic.onload = function() { var row = jQuery(element).closest('.catablog-row').get(0); var meta = calculateMeta(row); expand_lightbox(this, meta); }; fullsize_pic.onerror = function() { load_attempts++; if (load_attempts < 2) { this.src = this.src.replace("/catablog/fullsize", "/catablog/originals"); } }; if (element.nodeName.toLowerCase() == 'a') { fullsize_pic.src = element.href; } else { fullsize_pic.src = element.src.replace("/catablog/thumbnails", "/catablog/fullsize");; } } function expand_lightbox(img, meta) { var lightbox = jQuery('#catablog-whiteboard'); var w = img.width; var h = img.height; var s = img.src; var window_width = jQuery(window).width(); var window_height = jQuery(window).height(); if (w > window_width || h > window_height) { w_ratio = window_width / w - 0.1; h_ratio = window_height / h - 0.1; if (w_ratio < h_ratio) { w = w * w_ratio; h = h * w_ratio; } else { w = w * h_ratio; h = h * h_ratio; } } var title = "

" + meta.title + "

"; var description = "
" + meta.description + "
"; var nav = meta.nav; var close = meta.close // attach image and navigation jQuery(lightbox).append("
"); jQuery('#catablog-lightbox-image').height(h); if (!jQuery('#catablog-lightbox-image').append("")) { if (typeof(console) !== 'undefined' && console != null) { console.log('failed appending image to html dom'); } }; jQuery('#catablog-lightbox-image img').css({width:w, height:h}); jQuery('#catablog-lightbox-image').append(nav); jQuery('#catablog-lightbox-image a').height(h); // attach meta data below image jQuery(lightbox).append("
"); jQuery('#catablog-lightbox-meta').append(title); jQuery('#catablog-lightbox-meta').append(description); jQuery('#catablog-whiteboard').append(close); lightbox.animate({width:w, height:h}, 400, function() { jQuery('#catablog-whiteboard').removeClass('loading'); var full_height = h + jQuery('#catablog-lightbox-meta').outerHeight(); jQuery(this).children('#catablog-lightbox-meta').show(); jQuery(this).animate({height:full_height}, 400, function() { hold_click = false; bindNavigationControls(); }) jQuery('#catablog-lightbox-image').fadeIn(400, function() { }); }); } function change_lightbox(element) { jQuery('#catablog-whiteboard').addClass('loading'); var row = jQuery(element).closest('.catablog-row').get(0); var speed = 150; jQuery('#catablog-lightbox-meta').fadeOut(speed, function() { jQuery(this).remove(); }); jQuery('#catablog-lightbox-image').fadeOut(speed, function() { jQuery(this).remove(); load_catablog_image(element); }); } function navigate_lightbox(direction) { if (hold_click) { return false; } hold_click = true; unbindNavigationControls(); var selected = jQuery('.catablog-selected'); var new_image = null; if (direction == 'next') { new_image = lightbox_images[current_image + 1]; if (new_image == undefined) { current_image = 0; new_image = lightbox_images[current_image]; } current_image += 1; } else if (direction == 'prev') { new_image = lightbox_images[current_image - 1]; if (new_image == undefined) { current_image = lightbox_images.length - 1; new_image = lightbox_images[current_image]; } current_image -= 1; } // check if the new_image is an a tag or its wrapped in an a tag // if wrapped in an anchor tag, replace new_image with the anchor tag // if not wrapped in an achor tag, log an error to the console if it exists if (new_image.nodeName.toLowerCase() != 'a') { if (jQuery(new_image).closest('a').size() > 0) { new_image = jQuery(new_image).closest('a').get(0); } else { if (new_image.nodeName.toLowerCase() == 'img') { } else { if (typeof(console) !== 'undefined' && console != null) { console.log("Could not find the adjacent image because the adjacent .catablog-image element is not an anchor or image tag."); } hold_click = false; return false; } } } var new_href = ''; if (new_image.nodeName.toLowerCase() == 'a') { var new_href = new_image.href; } else { var new_href = new_image.src; } var new_extension = new_href.split('.').pop().toLowerCase(); if (in_array(new_extension, image_extensions) == false) { if (current_image == 0) { hold_click = false; navigate_lightbox('next'); } else if (current_image == (lightbox_images.length - 1)) { hold_click = false; navigate_lightbox('prev'); } else { hold_click = false; navigate_lightbox(direction); } return false; } new_thumbnail = new_image; selected.removeClass('catablog-selected'); jQuery(new_image).addClass('catablog-selected'); change_lightbox(new_thumbnail); } function close_lightbox() { unbindNavigationControls(); var fadeout_speed = 300; jQuery('#catablog-curtain').fadeOut(fadeout_speed, function() { jQuery(this).remove(); }); jQuery('#catablog-lightbox').fadeOut(fadeout_speed, function() { jQuery(this).remove(); }); jQuery('.catablog-selected').removeClass('catablog-selected'); } function calculateMeta(row) { var row = jQuery(row); if ((typeof js_i18n) == 'undefined') { var prev_tip = 'You may also press "P" or the left arrow on your keyboard'; var next_tip = 'You may also press "N" or the right arrow on your keyboard'; var close_tip = "Close LightBox Now"; // var prev_label = "PREV"; var next_label = "NEXT"; var close_label = "CLOSE"; } else { var prev_tip = ((typeof js_i18n.prev_tip) == 'undefined')? 'You may also press "P" or the left arrow on your keyboard' : js_i18n.prev_tip; var next_tip = ((typeof js_i18n.prev_tip) == 'undefined')? 'You may also press "N" or the right arrow on your keyboard' : js_i18n.next_tip; var close_tip = ((typeof js_i18n.prev_tip) == 'undefined')? 'Close LightBox Now' : js_i18n.close_tip; // var prev_label = ((typeof js_i18n.prev_tip) == 'undefined')? "PREV" : js_i18n.prev_label; var next_label = ((typeof js_i18n.prev_tip) == 'undefined')? "NEXT" : js_i18n.next_label; var close_label = ((typeof js_i18n.prev_tip) == 'undefined')? "CLOSE" : js_i18n.close_label; } var prev_button = ""+prev_label+""; var next_button = ""+next_label+""; var close_button = ""+close_label+""; var meta = {}; var title = row.find('.catablog-title').html() var description = row.find('.catablog-description').html(); meta.title = (title == null)? "" : title; meta.description = (description == null)? "" : description; meta.buynow = ""; meta.close = close_button; meta.nav = ""; if (settings['navigation'] == 'combine') { if (current_image < (lightbox_images.length - 1)) { meta.nav += next_button; } if (current_image > 0) { meta.nav += prev_button; } } else { var next_row_item = row.next().hasClass('catablog-row'); var prev_row_item = row.prev().hasClass('catablog-row'); var row_images = row.find('.catablog-image'); if (row_images.length > 1) { var clicked_image = jQuery(lightbox_images[current_image]); var subimage_offset = -1; for (var i = 0; i < row_images.length; i++) { if (clicked_image.attr('href') == row_images.eq(i).attr('href')) { subimage_offset = i; } } if (subimage_offset < 0) { if (typeof(console) !== 'undefined' && console != null) { console.log('SubImage Offset Error, subimage clicked in a catalog row that contains no subimages.'); } } else if (subimage_offset == 0) { var next_row_item = true; } else if (subimage_offset == (row_images.length - 1)) { var prev_row_item = true; } else { var next_row_item = true; var prev_row_item = true; } } if (next_row_item) { meta.nav += next_button; } // if (current_image > 0) { if (prev_row_item) { meta.nav += prev_button; } } return meta; } /****************************** ** SUPPORT METHODS ******************************/ function supportPositionFixed() { var isSupported = null; if (document.createElement) { var el = document.createElement('div'); if (el && el.style) { el.style.position = 'fixed'; el.style.top = '10px'; var root = document.body; if (root && root.appendChild && root.removeChild) { root.appendChild(el); isSupported = (el.offsetTop === 10); root.removeChild(el); } } } return isSupported; } function bindNavigationControls() { // bind next and previous buttons jQuery('#catablog-lightbox-prev').bind('click', function(event) { navigate_lightbox('prev'); return false; }); jQuery('#catablog-lightbox-next').bind('click', function(event) { navigate_lightbox('next'); return false; }); // bind close button jQuery('#catablog-lightbox-close').bind('click', function(event) { close_lightbox(); return false; }); jQuery('#catablog-lightbox-close').bind('mouseenter', function(event) { jQuery(this).addClass('catablog-lightbox-close-hover'); return false; }); jQuery('#catablog-lightbox-close').bind('mouseleave', function(event) { jQuery(this).removeClass('catablog-lightbox-close-hover'); return false; }); jQuery(document).bind('mousemove', function(event) { var close_button = jQuery('#catablog-lightbox-close'); if (close_button.is(':hidden')) { close_button.css('zIndex', 10800); close_button.fadeIn(50); } else { hideCloseButtonTimer(close_button); } }); // bind keyboard shortcuts jQuery(document).bind('keyup', function(event) { var key_code = (event.keyCode ? event.keyCode : event.which); var forward_keycodes = [39, 78, 83]; var back_keycodes = [37, 80, 65]; var escape_keycodes = [27]; if (in_array(key_code, forward_keycodes)) { jQuery('#catablog-lightbox-next').click(); } if (in_array(key_code, back_keycodes)) { jQuery('#catablog-lightbox-prev').click(); } if (in_array(key_code, escape_keycodes)) { close_lightbox(); } }); } function unbindNavigationControls() { jQuery('#catablog-lightbox-prev').unbind('click'); jQuery('#catablog-lightbox-next').unbind('click'); jQuery('#catablog-lightbox-close').unbind('click'); jQuery(document).unbind('mousemove'); jQuery(document).unbind('keyup'); jQuery('#catablog-lightbox-close').fadeOut(200); } function hideCloseButtonTimer(obj) { clearTimeout(timeout); timeout = setTimeout(function() { if (obj.hasClass('catablog-lightbox-close-hover')) { hideCloseButtonTimer(obj); } else { obj.fadeOut(200); } }, 1500); } function in_array (needle, haystack, argStrict) { var key = '', strict = !!argStrict; if (strict) { for (key in haystack) { if (haystack[key] === needle) { return true; } } } else { for (key in haystack) { if (haystack[key] == needle) { return true; } } } return false; } return this; }; });