Re: Feature Requests


Thank you for your your suggestion.

In Small Screen Mode (where screen real estate if often limited), the caption area and Button Bar are overlaid on top of the image but their visibility can be toggled on and off (so that the image can be viewed on its own) by tapping the screen.
However, if you like, you could set captionPosition to a non-OVERLAY value, set buttonBarPosition="TOP" and then set screenMode="LARGE" to have the gallery displayed in Large Screen Mode on all devices and in all browsers.
By doing so, the caption area and Button Bar will never obscure the main images (in any device or browser).

I understand that this is not an ideal solution to your suggestion (in Large Screen Mode, thumbnails are displayed alongside the main images taking up more screen real estate, which is why Small Screen Mode exists) but it might be suitable for some other users reading this thread.


Re: Feature Requests

JudoPhoto wrote:

It would be great to have an option of endless smooth vertical scrolling through thumbnails displayed on extra-small (phones) mobile devices.

I have faced a few occasions when users complained that they were puzzled by the GU interfaced, and were not sure what to do next. They get used to the default iOS / Android models of vertical scrolling in Photo apps.

I currently "addressed" this issue via putting the hint "<- SWIPE ->" as a gallery title (looks strange on a desktop, though).


I'd like to second, third and fourth this feature request.  Continuous vertical scrolling is the way to go for small screens!  In fact I would go further and suggest this as an option for large screens.  Instead of a nice, but otherwise non-functional splash page, I'd love an index page with continuous vertical scrolling of thumbnails.  Clicking on a thumb would take you to the regular photo page with the line of thumbs a the bottom of the screen.  It would also be nice to have a way to navigate back to the index page.


Re: Feature Requests

Hi, I've come across a navigation bug, or at least a confusing oddity...  When viewing the thumb pages in small screen mode there is no "Back" button displayed.  To get back to the gallery index page from a gallery thumb page, you have to view an individual photo to bring up a back button. Confusingly the back button on the photo page will take you back to the main gallery index page, not the thumb page!

My suggestion is:
1) Add a back button to the thumb page to you can navigate back to the gallery index from that page.
2) Have the back button on the photo page navigate back to the thumb page, not the gallery index page.



Re: Feature Requests


Many thanks for posting your suggestions.

Just for clarification (and for other users using the Back Button), if you leave the backButtonUrl empty, then the Back Button goes back one page in the browser's history.
You can also set the backButtonUrl to be a relative URL (relative to the web page containing the gallery's embedding code) or an absolute URL, in the form

Re: Feature Requests

I'd second the suggestion earlier to have title/caption text attributes (font, size, weight, line-spacing etc) settable in the options.

I need to regenerate a gallery on a regular basis, including varying other parameters, but when it comes to title/caption text I then have to go into the CSS each time and make a number of changes each time in order to match the site style.

Re: Feature Requests


Thank you for the suggestion.

You could perhaps add your custom CSS rules to the foot of the 'theme.css' template file that JuiceboxBuilder-Pro uses when a gallery is built (or just modify the file as necessary).
In doing so, the custom CSS rules would appear in all galleries generated by the application (without the need to manually add them to each gallery after they have been created).
The location of the template file on a Windows 10 machine would be:
C:\Program Files (x86)\JuiceboxBuilder-Pro\template\jbcore\classic\theme.css

I realise that this does not solve the problem that your suggestion would but it might make life a little easier in the meantime (but only if you use the same font settings for all your galleries).

Re: Feature Requests

@Steven - thanks for the prompt reply. I've come up with a workaround.

I'm embedding the Juicebox into a page, so I've included the necessary styles into a custom.css file which is loaded with the pages and used !important to ensure that Juicebox's styles don't override them. Clumsy, but it's working.

Can I add another feature request. The nature of my galleries is that the thumbnails aren't self-explanatory and it would be very useful to be able to have a brief caption for each to be able to see at a glance what they are.

Re: Feature Requests


I'm glad you've found a suitable workaround.
Also, thanks for the other suggestion.


Re: Feature Requests

Hope the next version may be add

1/ custom thumbnail in gallery index page (eg. image from libary)

2/ more than 2 level gallery index page

3/ custom gallery index page thumbnail can link to other page/website.

Re: Feature Requests


Thank you for the suggestions but they sound more like ideas for Showkase than for Juicebox.
I notice you have posted them in the Showkase Feature Requests forum thread, too (which is a better place for them). Thank you.

I just thought I'd mention this for any other Juicebox users reading this thread and wondering about Gallery Index Pages (which are a feature of Showkase rather than Juicebox).

Re: Feature Requests

I am developing a website for somebody whom I want to become self-sufficient. Yet he is extremely averse to coding. The website we have is far too taxonomically deep for Showkase, and currently we are moving forward with a Wordpress solution. The Wordpress plugin comes with its own set of challenges. What would help us out here is one of the following:

- To have the baseUrl as an option explicitly set in Juicebox Builder.

- To have a Pro options module in the WordPress plugin that mimics its appearance in the Builder and Lightroom plugins and in Showkase.



Re: Feature Requests

Hello Juicebox

This is what I want! … -portraits

This would be for an embedded Juicebox in a page. The juice box component would stretch all the way down the page and display the pictures full width as a list.
Any image clicked pops that image into full screen Juicebox, and you can navigate back and forth through the gallery.

Presume the embedded juicebox component could extend as far down the page as necessary to accommodate the list of images.

Do you think this functionality would be possible? You must be able see how awesome this would be ;)


Re: Feature Requests


Thank you for your suggestion.

As you are aware, such functionality is not currently available within Juicebox but something similar is available within another of our products - Showkase.
As well as being able to create Juicebox gallery pages, Showkase can create ListViewer gallery pages.
Images are listed one per row in a vertical list with image titles and/or captions displayed below each image.
There are certain layout options available which you can see if you log into the Live Demo Admin and go to edit the ListViewer gallery page.

Demos of ListViewer gallery pages can be found here:

This type of gallery is unique to Showkase (it cannot be created outside Showkase) and nothing happens when you click an image so it's not exactly like your suggestion but its the closest you can get with any of our products at the moment and I thought I should mention it in case it helps.

Re: Feature Requests

Hide social icon bar on phone resolution (to not obscure images).

Re: Feature Requests

Hello Juicebox,
I like your product, but I like to propose enhancements:

In the lightroom plugin, I miss the slider for the resolution (72-240 dpi).

Or (if this is easier) to bind an existing profile into the export process.



Re: Feature Requests

This is a widely misunderstood term.

DPI is a printing term.  It is exactly what it sounds like; dots per *inch* so is irrelevant for web/computer viewing.

To a computer of any sort (phone/tablet/PC/Mac) this resolution has absolutely no effect whatsoever.  To these devices a pixel is a pixel is a pixel.  If your image is 1000 pixels across, it will be displayed (at 100%) at 1000 pixels.  The DPI setting is irrelevant. 

Varying monitors have varying numbers of pixels squeezed in to an inch ... so for example, an iPhone 6s has 401 pixels per inch, whilst older Macs have 72ppi.  So your 1000 pixel image will be a different size (inches) on each, but will always just be 1000 pixels.

Re: Feature Requests

I know the question has been posed before (but dated 2012 / 2013 so this may have been already requested as a feature...)

Caption text.

As you know it can be below image (width of the image) or below thumbnails (width of screen.

I want the caption displayed below the image, but this is causing lots of caption text display errors for narrow images, so ideally I want the caption width to be the same as the thumbnail bar.

I know that this is not currently possible in the config options, but it seems like such an easy thing to do I'm not sure why this isn't already in as a feature?

(Juicebox Pro

Re: Feature Requests

I use Dreamweaver and had this problem of not being able to open existing galleries.
The reason was that the  config.xml file was locked, as Dreamweaver makes files write protected if you use the "check in" function in the Dreamweaver FTP panel.

After checking out the a specific config.xml file in Dreamweaver there was no problem opening the gallery in Juiceboxbuilder. : ))

But after failing to open a "checked in" gallery, you might have to restart Juicboxbuilder to be able to open it.



There should be a function in Juicboxbuilder, checking if any necessary files are write protected, and if so, Juiceboxbuilder should offer to make these files writable.

369 (edited by adastramedia 2016-03-05 11:21:08)

Re: Feature Requests

This is for the forum.
Wouldn't it bee much more convenient for everybody if all forum posts were sorted in reversed order so the latest post came on top - not on the last page.

Re: Feature Requests


Thank you for your suggestions.

Most forums I've visited over the years use chronological order (most recent posts at the bottom) by default.
Unfortunately, this forum does not have the option to allow users to change their preferred post order to reverse chronological order.


Re: Feature Requests

Tag Filter Feature

This was covered in a previous response to the same request, suggesting using an image hosting site such as "Flickr" I think, tagging images there and filter with links in Juicebox.

But I'm going to request again that "tag" filters would be a great feature in the core gallery, rather than linking to some other image gallery website. I would be interested in even something very very very very basic, doesn't even need to be fully fleshed out, would be willing to do any design or coding to access tags within each image. Maybe some sort of "hybrid" solution using the same filtering avaiable with externally provideed images.

Re: Feature Requests


Here's a PHP script you can use to display images from a designated folder on your web server which have certain specified tags.
Images should be tagged using the IPTC Keywords field (with each tag on a new line) in an imaging program such as Adobe Photoshop.

Within the script you can enter a comma-separated list of tags to match and set the tag mode to 'any' (images with any matching tags will be displayed) or 'all' (images with all matching tags will be displayed).
There are other variables you can use to order and sort the images and others to control image titles and captions.

To see this in action:
(1) Create a gallery with JuiceboxBuilder-Pro (using just a sample image to allow the gallery to be built) customizing the layout as necessary.
(2) Add the following line to your gallery's embedding code (in the 'index.html' file).

configUrl: 'config.php',

(3) Create a new file in a plain text editor with the code below (configuring the variables as required), save the file with the filename 'config.php' and place the file in your gallery folder.
(4) Leave the 'config.xml' file in your gallery folder (the PHP script will use the configuration options from there).
(5) Add the images you want to use in your gallery (tagged via IPTC Keywords) to the 'images' folder.

I hope this helps or at least points you in the right direction.

header('Content-type: application/xml');

function get_values($filename) {

    $values = array();

    if (is_file($filename)) {

        $dom_doc = new DOMDocument('1.0', 'UTF-8');

        $settings_tags = $dom_doc->getElementsByTagName('juiceboxgallery');
        $settings_tag = $settings_tags->item(0);

        if (!is_null($settings_tag)) {
            foreach ($settings_tag->attributes as $attribute) {
                $name = $attribute->nodeName;
                $value = $attribute->nodeValue;
                $values[$name] = $value;

    return $values;

function filter_element($value) {
    return $value !== '.' && $value !== '..';

function sort_images_datetime($a, $b) {
    $a_datetime = get_datetime($a);
    $b_datetime = get_datetime($b);
    if ($a_datetime === $b_datetime) {
        return 0;
    return $a_datetime < $b_datetime ? -1 : 1;

function clean_url($url, $directory) {
    $output = rtrim(trim($url), '/');
    $output = $directory ? $output . '/' : $output;
    if (preg_match('/^https?:/i', $output)) {
        $output = preg_replace('/^(https?:)\/*(.*)/i', '\\1//\\2', $output);
        $output = strtolower(parse_url($output, PHP_URL_SCHEME)) . '://' . parse_url($output, PHP_URL_HOST) . preg_replace('/\/+/', '/', parse_url($output, PHP_URL_PATH));
    } else {
        $output = preg_replace('/\/+/', '/', $output);
    return $output;

function get_attachments_folder($folder_url) {
    $attachments = array();
    if (preg_match('/^https?:\/\//', $folder_url)) {
        $dom_doc = new DOMDocument('1.0', 'UTF-8');
        $success = @$dom_doc->loadHTMLFile($folder_url);
        if ($success) {
            foreach ($dom_doc->getElementsByTagName('a') as $element) {
                $attachments[] = $folder_url . rawurldecode(basename($element->getAttribute('href')));
    } else {
        $leading_slash = strpos($folder_url, '/') === 0;
        $document_root = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : '';
        $root_dir = rtrim($document_root, '/');
        $directory = $leading_slash ? $root_dir . $folder_url : realpath(dirname(__file__) . '/' . $folder_url);
        if (is_dir($directory)) {
            $array = @scandir($directory);
            if ($array) {
                $files = array_filter($array, 'filter_element');
                $https = isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : '';
                $scheme = $https === 'on' ? 'https://' : 'http://';
                $path = $leading_slash ? $folder_url : str_replace($root_dir, '', $directory) . '/';
                $server_name = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '';
                foreach ($files as $file) {
                    $attachments[] = $scheme . $server_name . $path . $file;
    return $attachments;

function process_tag_folder($attachments, $comma_separated_values, $mode) {
    $output = $attachments;
    $media_tags = array_filter(array_map('trim', explode(',', $comma_separated_values)), 'strlen');
    $media_tags_count = count($media_tags);
    if ($media_tags_count > 0) {
        foreach ($attachments as $key=>$attachment) {
            $image_url = encode_url($attachment);
            $info = array();
            $image_size = @getimagesize($image_url, $info);
            $iptc = array();
            if ($image_size && isset($info['APP13'])) {
                $iptc = @iptcparse($info['APP13']);
            $image_keywords = $iptc && isset($iptc['2#025']) ? $iptc['2#025'] : array();
            $tags = array_filter(array_map('trim', $image_keywords), 'strlen');
            $array_intersect_count = count(array_intersect($media_tags, $tags));
            if (($mode === 'any' && $array_intersect_count === 0) || ($mode === 'all' && $array_intersect_count !== $media_tags_count)) {
    return array_values($output);

function order_attachments($attachments, $order) {
    $output = array();
    $all = $attachments;
    switch ($order) {
        case 'descending':
            $output = array_reverse($all);
        case 'shuffle':
            $output = $all;
        case 'ascending':
            $output = $all;
    return $output;

function encode_url($url) {
    $parse_url = parse_url($url);
    $scheme = isset($parse_url['scheme']) ? $parse_url['scheme'] : '';
    $host = isset($parse_url['host']) ? $parse_url['host'] : '';
    $path = isset($parse_url['path']) ? $parse_url['path'] : '';
    $query = isset($parse_url['query']) ? $parse_url['query'] : '';
    $implode_path = array();
    $explode_path = explode('/', $path);
    foreach ($explode_path as $fragment_path) {
        if ($fragment_path !== '') {
            $implode_path[] = rawurlencode($fragment_path);
    $new_path = !empty($implode_path) ? implode('/', $implode_path) : '';
    $implode_query = array();
    $explode_query = explode('&', $query);
    foreach ($explode_query as $fragment_query) {
        if ($fragment_query !== '') {
            $explode_fragment_query = explode('=', $fragment_query, 2);
            if (count($explode_fragment_query) === 2) {
                $implode_query[] = $explode_fragment_query[0] . '=' . urlencode($explode_fragment_query[1]);
    $new_query = !empty($implode_query) ? '?' . implode('&', $implode_query) : '';
    return $scheme . '://' . $host . '/' . $new_path . $new_query;

function line_break($input) {
    return preg_replace('/\r\n|\r|\n/', '<br />', $input);

function strip_control_characters($input) {
    $output = @preg_replace('/\p{Cc}+/u', '', $input);
    return $output ? $output : $input;

$dom_doc = new DOMDocument('1.0', 'UTF-8');
$dom_doc->formatOutput = true;

$settings_tag = $dom_doc->createElement('juiceboxgallery');

$gallery_filename = 'config.xml';

if (is_file($gallery_filename)) {

    $values = get_values($gallery_filename);

    foreach ($values as $key=>$value) {
        $settings_tag->setAttribute($key, $value);


$custom_values = array();

$custom_values['e_folderUrl'] = 'images'; // Path to folder containing images
$custom_values['e_folderTags'] = 'one,two'; // Comma-separated list of tags
$custom_values['e_folderTagMode'] = 'any'; // Can be 'all' or 'any'
$custom_values['e_folderTitle'] = 'filename'; // Can be 'filename' or 'iptc'
$custom_values['e_folderCaption'] = 'iptc';  // Can be 'filename' or 'iptc'
$custom_values['e_folderSort'] = 'filename'; // Can be 'filename' or 'date'
$custom_values['e_folderOrder'] = 'ascending'; // Can be 'ascending', 'descending' or 'shuffle'
$custom_values['e_linkTarget'] = '_blank'; // Can be '_blank', '_parent', '_self' or '_top'
$custom_values['e_displayTitle'] = 'true'; // Can br 'true' or 'false'
$custom_values['e_displayCaption'] = 'true'; // Can br 'true' or 'false'

$custom_values['e_folderUrl'] = clean_url($custom_values['e_folderUrl'], true);
$custom_values['e_folderTags'] = trim($custom_values['e_folderTags']);
$custom_values['e_displayTitle'] = isset($custom_values['e_displayTitle']) ? $custom_values['e_displayTitle'] : 'false';
$custom_values['e_displayCaption'] = isset($custom_values['e_displayCaption']) ? $custom_values['e_displayCaption'] : 'false';

$attachments = get_attachments_folder($custom_values['e_folderUrl']);

if ($attachments) {
    $attachments = process_tag_folder($attachments, $custom_values['e_folderTags'], $custom_values['e_folderTagMode']);
    switch ($custom_values['e_folderSort']) {
        case 'filename':
        case 'date':
            usort($attachments, 'sort_images_datetime');
    $attachments = order_attachments($attachments, $custom_values['e_folderOrder']);
    foreach ($attachments as $attachment) {
        $image_url = encode_url($attachment);
        $iptc = array();
        if (($custom_values['e_displayTitle'] === 'true' && $custom_values['e_folderTitle'] === 'iptc') || ($custom_values['e_displayCaption'] === 'true' && $custom_values['e_folderCaption'] === 'iptc')) {
            $info = array();
            $image_size = @getimagesize($image_url, $info);
            if ($image_size && isset($info['APP13'])) {
                $iptc = @iptcparse($info['APP13']);
        $image_element = $dom_doc->createElement('image');
        $image_element->setAttribute('imageURL', $image_url);
        $image_element->setAttribute('thumbURL', $image_url);
        $image_element->setAttribute('linkURL', $image_url);
        $image_element->setAttribute('linkTarget', $custom_values['e_linkTarget']);
        if ($custom_values['e_displayTitle'] === 'true') {
            $title_element = $dom_doc->createElement('title');
            $image_title = '';
            switch ($custom_values['e_folderTitle']) {
                case 'filename':
                    $image_title = pathinfo($attachment, PATHINFO_FILENAME);
                case 'iptc':
                    $image_title = $iptc && isset($iptc['2#005']) ? $iptc['2#005'][0] : '';
            $image_title = line_break($image_title);
            $image_title = strip_control_characters($image_title);
            $title_text = $dom_doc->createCDATASection($image_title);
        if ($custom_values['e_displayCaption'] === 'true') {
            $caption_element = $dom_doc->createElement('caption');
            $image_caption = '';
            switch ($custom_values['e_folderCaption']) {
                case 'filename':
                    $image_caption = pathinfo($attachment, PATHINFO_FILENAME);
                case 'iptc':
                    $image_caption = $iptc && isset($iptc['2#120']) ? $iptc['2#120'][0] : '';
            $image_caption = line_break($image_caption);
            $image_caption = strip_control_characters($image_caption);
            $caption_text = $dom_doc->createCDATASection($image_caption);


echo $dom_doc->saveXML();


Re: Feature Requests

Request option to show thumbnail button only when expanded.

(So embedded gallery shows no thumbnail button - expand to full page and thumbnail button is visible).

Behaviour if thumbs are selected when full page gallery is closed = thumbs disappear when return to embedded gallery.

374 (edited by Steven @ Juicebox 2016-05-02 17:55:35)

Re: Feature Requests

we'd like to have ability to setup multiple accounts and give different permission.

Thanks, ShowKase Support!

Edit: Copied to Showkase Feature Requests thread here:

Re: Feature Requests

Suggestions from user222 in this forum thread:

Gallery / html5

if fading is selected the gallery is shown different on desktop computer (fading) and tablets / smartphone (sliding). Best would be if fading would also possible on tablets and smartphones. Since that is actually not possible I would suggest that on tablets and smartphone  sliding would be possible with no delay independent  the time for fading on desktop.

I noticed a gallery with interested features. A combinations of images which are sliding and fading AND very interested text can also be added (sliding and fading).

It might be fine im some improvements of the gallery would be possible.