Index: /extensions/stripped_galleria/admin/admin.inc.php
===================================================================
--- /extensions/stripped_galleria/admin/admin.inc.php	(revision 12977)
+++ /extensions/stripped_galleria/admin/admin.inc.php	(revision 12977)
@@ -0,0 +1,36 @@
+<?php
+
+// Need upgrade?
+
+global $conf;
+
+if (!isset($conf['stripped-galleria']))
+  include(PHPWG_THEMES_PATH.'stripped-galleria/admin/upgrade.inc.php');
+
+load_language('theme.lang', PHPWG_THEMES_PATH.'stripped-galleria/');
+
+$config= array ();
+
+if(isset($_POST['submit_stripped-galleria']))
+{
+	$config['clicknext']=($_POST['f_clickAction'] == 'next');
+	$config['lightbox']='none';
+	if ($_POST['f_clickAction'] == 'lightbox') {$config['lightbox']='normal';}
+	if ($_POST['f_clickAction'] == 'lightboxHD') {$config['lightbox']='hd';}
+	$config['transition']=$_POST['f_transition'];
+
+	conf_update_param('stripped-galleria', pwg_db_real_escape_string(serialize($config)));
+
+	array_push($page['infos'], l10n('Information data registered in database'));
+
+	load_conf_from_db();
+}
+
+$template->set_filenames(array(
+    'theme_admin_content' => dirname(__FILE__) . '/admin.tpl'));
+
+$template->assign('options', unserialize($conf['stripped-galleria']));
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'theme_admin_content');
+  
+?>
Index: /extensions/stripped_galleria/admin/admin.tpl
===================================================================
--- /extensions/stripped_galleria/admin/admin.tpl	(revision 12977)
+++ /extensions/stripped_galleria/admin/admin.tpl	(revision 12977)
@@ -0,0 +1,31 @@
+<div class="titrePage">
+	<h2>stripped-galleria Theme Configuration</h2>
+</div>
+
+<form method="post" class="properties" action="" ENCTYPE="multipart/form-data" name="form" class="properties">
+	<div>
+		<fieldset>
+			<legend>{'Galleria script options'|@translate}</legend>
+			<ul>
+				<li><label>
+					<span class="property">{'Click on image action'|@translate}</span>&nbsp;
+					<select name="f_clickAction">
+						<option value="nothing" {if (!($options.clicknext) && ($options.lightbox=="none"))}selected{/if}>{'do nothing'|@translate}</option>
+						<option value="next" {if ($options.clicknext)}selected{/if}>{'display next picture'|@translate}</option>
+						<option value="lightbox" {if ($options.lightbox=="normal")}selected{/if}>{'opens image in a lightbox'|@translate}</option>
+						<option value="lightboxHD" {if ($options.lightbox=="hd")}selected{/if}>{'opens HD image in a lightbox'|@translate}</option>
+					</select>
+				</label></li>
+				<li><label>
+					<span class="property">{'Transition function'|@translate}</span>&nbsp;
+					<select name="f_transition" style="min-width:150px;">
+						<option value="slide" {if ($options.transition=="slide")}selected{/if}>slide</option>
+						<option value="fade" {if ($options.transition=="fade")}selected{/if}>fade</option>
+						<option value="fadeslide" {if ($options.transition=="fadeslide")}selected{/if}>fadeslide</option>
+					</select>
+				</label></li>
+			</ul>
+		</fieldset>
+	</div>
+	<p><input class="submit" type="submit" value="{'Submit'|@translate}" name="submit_stripped-galleria" /></p>
+</form>
Index: /extensions/stripped_galleria/admin/index.php
===================================================================
--- /extensions/stripped_galleria/admin/index.php	(revision 12977)
+++ /extensions/stripped_galleria/admin/index.php	(revision 12977)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008      Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/stripped_galleria/admin/maintain.inc.php
===================================================================
--- /extensions/stripped_galleria/admin/maintain.inc.php	(revision 12977)
+++ /extensions/stripped_galleria/admin/maintain.inc.php	(revision 12977)
@@ -0,0 +1,31 @@
+<?php
+
+function theme_activate($id, $version, &$errors)
+{
+  global $prefixeTable, $conf;
+
+  if (!isset($conf['stripped-galleria']))
+  {
+    $config = array(
+	'clicknext'						=> false,
+	'transition'					=> 'slide',
+	'lightbox'						=> 'none'
+      );
+      
+    $query = "
+INSERT INTO " . CONFIG_TABLE . " (param,value,comment)
+VALUES ('stripped-galleria' , '".pwg_db_real_escape_string(serialize($config))."' , 'stripped-galleria theme parameters');";
+
+    pwg_query($query);
+  }
+}
+
+function theme_deactivate()
+{
+  global $prefixeTable;
+
+  $query = "DELETE FROM " . CONFIG_TABLE . " WHERE param='stripped-galleria';";
+  pwg_query($query);
+}
+
+?>
Index: /extensions/stripped_galleria/admin/upgrade.inc.php
===================================================================
--- /extensions/stripped_galleria/admin/upgrade.inc.php	(revision 12977)
+++ /extensions/stripped_galleria/admin/upgrade.inc.php	(revision 12977)
@@ -0,0 +1,23 @@
+<?php
+
+if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
+
+global $prefixeTable, $conf;
+
+if (!isset($conf['stripped-galleria']))
+{
+    $config = array(
+	'clicknext'						=> false,
+	'transition'					=> 'slide'
+	'lightbox'						=> 'none'
+      );
+      
+    $query = "
+INSERT INTO " . CONFIG_TABLE . " (param,value,comment)
+VALUES ('stripped-galleria' , '".pwg_db_real_escape_string(serialize($config))."' , 'stripped-galleria theme parameters');";
+
+    pwg_query($query);
+
+}
+
+?>
Index: /extensions/stripped_galleria/galleria/LICENSE
===================================================================
--- /extensions/stripped_galleria/galleria/LICENSE	(revision 12977)
+++ /extensions/stripped_galleria/galleria/LICENSE	(revision 12977)
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2011 Aino http://aino.se
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: /extensions/stripped_galleria/galleria/galleria-1.2.6.js
===================================================================
--- /extensions/stripped_galleria/galleria/galleria-1.2.6.js	(revision 12977)
+++ /extensions/stripped_galleria/galleria/galleria-1.2.6.js	(revision 12977)
@@ -0,0 +1,5060 @@
+/**
+ * @preserve Galleria v 1.2.6 2011-12-12
+ * http://galleria.aino.se
+ *
+ * Copyright (c) 2011, Aino
+ * Licensed under the MIT license.
+ */
+
+/*global jQuery, navigator, Galleria:true, Image */
+
+(function( $ ) {
+
+// some references
+var undef,
+    window = this,
+    doc    = window.document,
+    $doc   = $( doc ),
+    $win   = $( window ),
+
+// internal constants
+    VERSION = 1.26,
+    DEBUG = true,
+    TIMEOUT = 30000,
+    DUMMY = false,
+    NAV = navigator.userAgent.toLowerCase(),
+    HASH = window.location.hash.replace(/#\//, ''),
+    IE = (function() {
+
+        var v = 3,
+            div = doc.createElement( 'div' ),
+            all = div.getElementsByTagName( 'i' );
+
+        do {
+            div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->';
+        } while ( all[0] );
+
+        return v > 4 ? v : undef;
+
+    }() ),
+    DOM = function() {
+        return {
+            html:  doc.documentElement,
+            body:  doc.body,
+            head:  doc.getElementsByTagName('head')[0],
+            title: doc.title
+        };
+    },
+
+    // list of Galleria events
+    _eventlist = 'data ready thumbnail loadstart loadfinish image play pause progress ' +
+              'fullscreen_enter fullscreen_exit idle_enter idle_exit rescale ' +
+              'lightbox_open lightbox_close lightbox_image',
+
+    _events = (function() {
+
+        var evs = [];
+
+        $.each( _eventlist.split(' '), function( i, ev ) {
+            evs.push( ev );
+
+            // legacy events
+            if ( /_/.test( ev ) ) {
+                evs.push( ev.replace( /_/g, '' ) );
+            }
+        });
+
+        return evs;
+
+    }()),
+
+    // legacy options
+    // allows the old my_setting syntax and converts it to camel case
+
+    _legacyOptions = function( options ) {
+
+        var n;
+
+        if ( typeof options !== 'object' ) {
+
+            // return whatever it was...
+            return options;
+        }
+
+        $.each( options, function( key, value ) {
+            if ( /^[a-z]+_/.test( key ) ) {
+                n = '';
+                $.each( key.split('_'), function( i, k ) {
+                    n += i > 0 ? k.substr( 0, 1 ).toUpperCase() + k.substr( 1 ) : k;
+                });
+                options[ n ] = value;
+                delete options[ key ];
+            }
+        });
+
+        return options;
+    },
+
+    _patchEvent = function( type ) {
+
+        // allow 'image' instead of Galleria.IMAGE
+        if ( $.inArray( type, _events ) > -1 ) {
+            return Galleria[ type.toUpperCase() ];
+        }
+
+        return type;
+    },
+
+    // the internal timeouts object
+    // provides helper methods for controlling timeouts
+    _timeouts = {
+
+        trunk: {},
+
+        add: function( id, fn, delay, loop ) {
+            loop = loop || false;
+            this.clear( id );
+            if ( loop ) {
+                var old = fn;
+                fn = function() {
+                    old();
+                    _timeouts.add( id, fn, delay );
+                };
+            }
+            this.trunk[ id ] = window.setTimeout( fn, delay );
+        },
+
+        clear: function( id ) {
+
+            var del = function( i ) {
+                window.clearTimeout( this.trunk[ i ] );
+                delete this.trunk[ i ];
+            }, i;
+
+            if ( !!id && id in this.trunk ) {
+                del.call( _timeouts, id );
+
+            } else if ( typeof id === 'undefined' ) {
+                for ( i in this.trunk ) {
+                    if ( this.trunk.hasOwnProperty( i ) ) {
+                        del.call( _timeouts, i );
+                    }
+                }
+            }
+        }
+    },
+
+    // the internal gallery holder
+    _galleries = [],
+
+    // the internal instance holder
+    _instances = [],
+
+    // flag for errors
+    _hasError = false,
+
+    // canvas holder
+    _canvas = false,
+
+    // instance pool, holds the galleries until themeLoad is triggered
+    _pool = [],
+
+    // themeLoad trigger
+    _themeLoad = function( theme ) {
+        Galleria.theme = theme;
+
+        // run the instances we have in the pool
+        $.each( _pool, function( i, instance ) {
+            if ( !instance._initialized ) {
+                instance._init.call( instance );
+            }
+        });
+    },
+
+    // the Utils singleton
+    Utils = (function() {
+
+        return {
+
+            array : function( obj ) {
+                return Array.prototype.slice.call(obj, 0);
+            },
+
+            create : function( className, nodeName ) {
+                nodeName = nodeName || 'div';
+                var elem = doc.createElement( nodeName );
+                elem.className = className;
+                return elem;
+            },
+
+            getScriptPath : function( src ) {
+
+                // the currently executing script is always the last
+                src = src || $('script:last').attr('src');
+                var slices = src.split('/');
+
+                if (slices.length == 1) {
+                    return '';
+                }
+
+                slices.pop();
+
+                return slices.join('/') + '/';
+            },
+
+            // CSS3 transitions, added in 1.2.4
+            animate : (function() {
+
+                // detect transition
+                var transition = (function( style ) {
+                    var props = 'transition WebkitTransition MozTransition OTransition'.split(' '),
+                        i;
+
+                    // disable css3 animations in opera until stable
+                    if ( window.opera ) {
+                        return false;
+                    }
+
+                    for ( i = 0; props[i]; i++ ) {
+                        if ( typeof style[ props[ i ] ] !== 'undefined' ) {
+                            return props[ i ];
+                        }
+                    }
+                    return false;
+                }(( doc.body || doc.documentElement).style ));
+
+                // map transitionend event
+                var endEvent = {
+                    MozTransition: 'transitionend',
+                    OTransition: 'oTransitionEnd',
+                    WebkitTransition: 'webkitTransitionEnd',
+                    transition: 'transitionend'
+                }[ transition ];
+
+                // map bezier easing conversions
+                var easings = {
+                    _default: [0.25, 0.1, 0.25, 1],
+                    galleria: [0.645, 0.045, 0.355, 1],
+                    galleriaIn: [0.55, 0.085, 0.68, 0.53],
+                    galleriaOut: [0.25, 0.46, 0.45, 0.94],
+                    ease: [0.25, 0, 0.25, 1],
+                    linear: [0.25, 0.25, 0.75, 0.75],
+                    'ease-in': [0.42, 0, 1, 1],
+                    'ease-out': [0, 0, 0.58, 1],
+                    'ease-in-out': [0.42, 0, 0.58, 1]
+                };
+
+                // function for setting transition css for all browsers
+                var setStyle = function( elem, value, suffix ) {
+                    var css = {};
+                    suffix = suffix || 'transition';
+                    $.each( 'webkit moz ms o'.split(' '), function() {
+                        css[ '-' + this + '-' + suffix ] = value;
+                    });
+                    elem.css( css );
+                };
+
+                // clear styles
+                var clearStyle = function( elem ) {
+                    setStyle( elem, 'none', 'transition' );
+                    if ( Galleria.WEBKIT && Galleria.TOUCH ) {
+                        setStyle( elem, 'translate3d(0,0,0)', 'transform' );
+                        if ( elem.data('revert') ) {
+                            elem.css( elem.data('revert') );
+                            elem.data('revert', null);
+                        }
+                    }
+                };
+
+                // various variables
+                var change, strings, easing, syntax, revert, form, css;
+
+                // the actual animation method
+                return function( elem, to, options ) {
+
+                    // extend defaults
+                    options = $.extend({
+                        duration: 400,
+                        complete: function(){},
+                        stop: false
+                    }, options);
+
+                    // cache jQuery instance
+                    elem = $( elem );
+
+                    if ( !options.duration ) {
+                        elem.css( to );
+                        options.complete.call( elem[0] );
+                        return;
+                    }
+
+                    // fallback to jQuery's animate if transition is not supported
+                    if ( !transition ) {
+                        elem.animate(to, options);
+                        return;
+                    }
+
+                    // stop
+                    if ( options.stop ) {
+                        // clear the animation
+                        elem.unbind( endEvent );
+                        clearStyle( elem );
+                    }
+
+                    // see if there is a change
+                    change = false;
+                    $.each( to, function( key, val ) {
+                        css = elem.css( key );
+                        if ( Utils.parseValue( css ) != Utils.parseValue( val ) ) {
+                            change = true;
+                        }
+                        // also add computed styles for FF
+                        elem.css( key, css );
+                    });
+                    if ( !change ) {
+                        window.setTimeout( function() {
+                            options.complete.call( elem[0] );
+                        }, options.duration );
+                        return;
+                    }
+
+                    // the css strings to be applied
+                    strings = [];
+
+                    // the easing bezier
+                    easing = options.easing in easings ? easings[ options.easing ] : easings._default;
+
+                    // the syntax
+                    syntax = ' ' + options.duration + 'ms' + ' cubic-bezier('  + easing.join(',') + ')';
+
+                    // add a tiny timeout so that the browsers catches any css changes before animating
+                    window.setTimeout(function() {
+
+                        // attach the end event
+                        elem.one(endEvent, (function( elem ) {
+                            return function() {
+                                // clear the animation
+                                clearStyle(elem);
+
+                                // run the complete method
+                                options.complete.call(elem[0]);
+                            };
+                        }( elem )));
+
+                        // do the webkit translate3d for better performance on iOS
+                        if( Galleria.WEBKIT && Galleria.TOUCH ) {
+
+                            revert = {};
+                            form = [0,0,0];
+
+                            $.each( ['left', 'top'], function(i, m) {
+                                if ( m in to ) {
+                                    form[ i ] = ( Utils.parseValue( to[ m ] ) - Utils.parseValue(elem.css( m )) ) + 'px';
+                                    revert[ m ] = to[ m ];
+                                    delete to[ m ];
+                                }
+                            });
+
+                            if ( form[0] || form[1]) {
+
+                                elem.data('revert', revert);
+
+                                strings.push('-webkit-transform' + syntax);
+
+                                // 3d animate
+                                setStyle( elem, 'translate3d(' + form.join(',') + ')', 'transform');
+                            }
+                        }
+
+                        // push the animation props
+                        $.each(to, function( p, val ) {
+                            strings.push(p + syntax);
+                        });
+
+                        // set the animation styles
+                        setStyle( elem, strings.join(',') );
+
+                        // animate
+                        elem.css( to );
+
+                    },1 );
+                };
+            }()),
+
+            removeAlpha : function( elem ) {
+                if ( IE < 9 && elem ) {
+
+                    var style = elem.style,
+                        currentStyle = elem.currentStyle,
+                        filter = currentStyle && currentStyle.filter || style.filter || "";
+
+                    if ( /alpha/.test( filter ) ) {
+                        style.filter = filter.replace( /alpha\([^)]*\)/i, '' );
+                    }
+                }
+            },
+
+            forceStyles : function( elem, styles ) {
+                elem = $(elem);
+                if ( elem.attr( 'style' ) ) {
+                    elem.data( 'styles', elem.attr( 'style' ) ).removeAttr( 'style' );
+                }
+                elem.css( styles );
+            },
+
+            revertStyles : function() {
+                $.each( Utils.array( arguments ), function( i, elem ) {
+
+                    elem = $( elem );
+                    elem.removeAttr( 'style' );
+
+                    elem.attr('style',''); // "fixes" webkit bug
+
+                    if ( elem.data( 'styles' ) ) {
+                        elem.attr( 'style', elem.data('styles') ).data( 'styles', null );
+                    }
+                });
+            },
+
+            moveOut : function( elem ) {
+                Utils.forceStyles( elem, {
+                    position: 'absolute',
+                    left: -10000
+                });
+            },
+
+            moveIn : function() {
+                Utils.revertStyles.apply( Utils, Utils.array( arguments ) );
+            },
+
+            elem : function( elem ) {
+                if (elem instanceof $) {
+                    return {
+                        $: elem,
+                        dom: elem[0]
+                    };
+                } else {
+                    return {
+                        $: $(elem),
+                        dom: elem
+                    };
+                }
+            },
+
+            hide : function( elem, speed, callback ) {
+
+                callback = callback || function(){};
+
+                var el = Utils.elem( elem ),
+                    $elem = el.$;
+
+                elem = el.dom;
+
+                // save the value if not exist
+                if (! $elem.data('opacity') ) {
+                    $elem.data('opacity', $elem.css('opacity') );
+                }
+
+                // always hide
+                var style = { opacity: 0 };
+
+                if (speed) {
+
+                    var complete = IE < 9 && elem ? function() {
+                        Utils.removeAlpha( elem );
+                        elem.style.visibility = 'hidden';
+                        callback.call( elem );
+                    } : callback;
+
+                    Utils.animate( elem, style, {
+                        duration: speed,
+                        complete: complete,
+                        stop: true
+                    });
+                } else {
+                    if ( IE < 9 && elem ) {
+                        Utils.removeAlpha( elem );
+                        elem.style.visibility = 'hidden';
+                    } else {
+                        $elem.css( style );
+                    }
+                }
+            },
+
+            show : function( elem, speed, callback ) {
+
+                callback = callback || function(){};
+
+                var el = Utils.elem( elem ),
+                    $elem = el.$;
+
+                elem = el.dom;
+
+                // bring back saved opacity
+                var saved = parseFloat( $elem.data('opacity') ) || 1,
+                    style = { opacity: saved };
+
+                // animate or toggle
+                if (speed) {
+
+                    if ( IE < 9 ) {
+                        $elem.css('opacity', 0);
+                        elem.style.visibility = 'visible';
+                    }
+
+                    var complete = IE < 9 && elem ? function() {
+                        if ( style.opacity == 1 ) {
+                            Utils.removeAlpha( elem );
+                        }
+                        callback.call( elem );
+                    } : callback;
+
+                    Utils.animate( elem, style, {
+                        duration: speed,
+                        complete: complete,
+                        stop: true
+                    });
+                } else {
+                    if ( IE < 9 && style.opacity == 1 && elem ) {
+                        Utils.removeAlpha( elem );
+                        elem.style.visibility = 'visible';
+                    } else {
+                        $elem.css( style );
+                    }
+                }
+            },
+
+
+            // enhanced click for mobile devices
+            // we bind a touchend and hijack any click event in the bubble
+            // then we execute the click directly and save it in a separate data object for later
+            optimizeTouch: (function() {
+
+                var node,
+                    evs,
+                    fakes,
+                    travel,
+                    evt = {},
+                    handler = function( e ) {
+                        e.preventDefault();
+                        evt = $.extend({}, e, true);
+                    },
+                    attach = function() {
+                        this.evt = evt;
+                    },
+                    fake = function() {
+                        this.handler.call(node, this.evt);
+                    };
+
+                return function( elem ) {
+
+                    $(elem).bind('touchend', function( e ) {
+
+                        node = e.target;
+                        travel = true;
+
+                        while( node.parentNode && node != e.currentTarget && travel ) {
+
+                            evs =   $(node).data('events');
+                            fakes = $(node).data('fakes');
+
+                            if (evs && 'click' in evs) {
+
+                                travel = false;
+                                e.preventDefault();
+
+                                // fake the click and save the event object
+                                $(node).click(handler).click();
+
+                                // remove the faked click
+                                evs.click.pop();
+
+                                // attach the faked event
+                                $.each( evs.click, attach);
+
+                                // save the faked clicks in a new data object
+                                $(node).data('fakes', evs.click);
+
+                                // remove all clicks
+                                delete evs.click;
+
+                            } else if ( fakes ) {
+
+                                travel = false;
+                                e.preventDefault();
+
+                                // fake all clicks
+                                $.each( fakes, fake );
+                            }
+
+                            // bubble
+                            node = node.parentNode;
+                        }
+                    });
+                };
+            }()),
+
+            addTimer : function() {
+                _timeouts.add.apply( _timeouts, Utils.array( arguments ) );
+                return this;
+            },
+
+            clearTimer : function() {
+                _timeouts.clear.apply( _timeouts, Utils.array( arguments ) );
+                return this;
+            },
+
+            wait : function(options) {
+                options = $.extend({
+                    until : function() { return false; },
+                    success : function() {},
+                    error : function() { Galleria.raise('Could not complete wait function.'); },
+                    timeout: 3000
+                }, options);
+
+                var start = Utils.timestamp(),
+                    elapsed,
+                    now,
+                    fn = function() {
+                        now = Utils.timestamp();
+                        elapsed = now - start;
+                        if ( options.until( elapsed ) ) {
+                            options.success();
+                            return false;
+                        }
+
+                        if (now >= start + options.timeout) {
+                            options.error();
+                            return false;
+                        }
+                        window.setTimeout(fn, 10);
+                    };
+
+                window.setTimeout(fn, 10);
+            },
+
+            toggleQuality : function( img, force ) {
+
+                if ( ( IE !== 7 && IE !== 8 ) || !img ) {
+                    return;
+                }
+
+                if ( typeof force === 'undefined' ) {
+                    force = img.style.msInterpolationMode === 'nearest-neighbor';
+                }
+
+                img.style.msInterpolationMode = force ? 'bicubic' : 'nearest-neighbor';
+            },
+
+            insertStyleTag : function( styles ) {
+                var style = doc.createElement( 'style' );
+                DOM().head.appendChild( style );
+
+                if ( style.styleSheet ) { // IE
+                    style.styleSheet.cssText = styles;
+                } else {
+                    var cssText = doc.createTextNode( styles );
+                    style.appendChild( cssText );
+                }
+            },
+
+            // a loadscript method that works for local scripts
+            loadScript: function( url, callback ) {
+
+                var done = false,
+                    script = $('<scr'+'ipt>').attr({
+                        src: url,
+                        async: true
+                    }).get(0);
+
+               // Attach handlers for all browsers
+               script.onload = script.onreadystatechange = function() {
+                   if ( !done && (!this.readyState ||
+                       this.readyState === 'loaded' || this.readyState === 'complete') ) {
+
+                       done = true;
+
+                       // Handle memory leak in IE
+                       script.onload = script.onreadystatechange = null;
+
+                       if (typeof callback === 'function') {
+                           callback.call( this, this );
+                       }
+                   }
+               };
+
+               DOM().head.appendChild( script );
+            },
+
+            // parse anything into a number
+            parseValue: function( val ) {
+                if (typeof val === 'number') {
+                    return val;
+                } else if (typeof val === 'string') {
+                    var arr = val.match(/\-?\d|\./g);
+                    return arr && arr.constructor === Array ? arr.join('')*1 : 0;
+                } else {
+                    return 0;
+                }
+            },
+
+            // timestamp abstraction
+            timestamp: function() {
+                return new Date().getTime();
+            },
+
+            // this is pretty crap, but works for now
+            // it will add a callback, but it can't guarantee that the styles can be fetched
+            // using getComputedStyle further checking needed, possibly a dummy element
+            loadCSS : function( href, id, callback ) {
+
+                var link,
+                    ready = false,
+                    length;
+
+                // look for manual css
+                $('link[rel=stylesheet]').each(function() {
+                    if ( new RegExp( href ).test( this.href ) ) {
+                        link = this;
+                        return false;
+                    }
+                });
+
+                if ( typeof id === 'function' ) {
+                    callback = id;
+                    id = undef;
+                }
+
+                callback = callback || function() {}; // dirty
+
+                // if already present, return
+                if ( link ) {
+                    callback.call( link, link );
+                    return link;
+                }
+
+                // save the length of stylesheets to check against
+                length = doc.styleSheets.length;
+
+                // check for existing id
+                if( $('#'+id).length ) {
+                    $('#'+id).attr('href', href);
+                    length--;
+                    ready = true;
+                } else {
+                    link = $( '<link>' ).attr({
+                        rel: 'stylesheet',
+                        href: href,
+                        id: id
+                    }).get(0);
+
+                    window.setTimeout(function() {
+                        var styles = $('link[rel="stylesheet"], style');
+                        if ( styles.length ) {
+                            styles.get(0).parentNode.insertBefore( link, styles[0] );
+                        } else {
+                            DOM().head.appendChild( link );
+                        }
+
+                        if ( IE ) {
+
+                            // IE has a limit of 31 stylesheets in one document
+                            if( length >= 31 ) {
+                                Galleria.raise( 'You have reached the browser stylesheet limit (31)', true );
+                                return;
+                            }
+
+                            // todo: test if IE really needs the readyState
+                            link.onreadystatechange = function(e) {
+                                if ( !ready && (!this.readyState ||
+                                    this.readyState === 'loaded' || this.readyState === 'complete') ) {
+                                    ready = true;
+                                }
+                            };
+                        } else {
+                            // final test via ajax if not local
+                            if ( !( new RegExp('file://','i').test( href ) ) ) {
+                                $.ajax({
+                                    url: href,
+                                    success: function() {
+                                        ready = true;
+                                    },
+                                    error: function(e) {
+                                        // pass if origin is rejected in chrome for some reason
+                                        if( e.isRejected() && Galleria.WEBKIT ) {
+                                            ready = true;
+                                        }
+                                    }
+                                });
+                            } else {
+                                ready = true;
+                            }
+                        }
+                    }, 10);
+                }
+
+                if ( typeof callback === 'function' ) {
+
+                    Utils.wait({
+                        until: function() {
+                            return ready && doc.styleSheets.length > length;
+                        },
+                        success: function() {
+                            window.setTimeout( function() {
+                                callback.call( link, link );
+                            }, 100);
+                        },
+                        error: function() {
+                            Galleria.raise( 'Theme CSS could not load', true );
+                        },
+                        timeout: 10000
+                    });
+                }
+                return link;
+            }
+        };
+    }()),
+
+    // the transitions holder
+    _transitions = (function() {
+
+        var _slide = function(params, complete, fade, door) {
+
+            var easing = this.getOptions('easing'),
+                distance = this.getStageWidth(),
+                from = { left: distance * ( params.rewind ? -1 : 1 ) },
+                to = { left: 0 };
+
+            if ( fade ) {
+                from.opacity = 0;
+                to.opacity = 1;
+            } else {
+                from.opacity = 1;
+            }
+
+            $(params.next).css(from);
+
+            Utils.animate(params.next, to, {
+                duration: params.speed,
+                complete: (function( elems ) {
+                    return function() {
+                        complete();
+                        elems.css({
+                            left: 0
+                        });
+                    };
+                }( $( params.next ).add( params.prev ) )),
+                queue: false,
+                easing: easing
+            });
+
+            if (door) {
+                params.rewind = !params.rewind;
+            }
+
+            if (params.prev) {
+
+                from = { left: 0 };
+                to = { left: distance * ( params.rewind ? 1 : -1 ) };
+
+                if ( fade ) {
+                    from.opacity = 1;
+                    to.opacity = 0;
+                }
+
+                $(params.prev).css(from);
+                Utils.animate(params.prev, to, {
+                    duration: params.speed,
+                    queue: false,
+                    easing: easing,
+                    complete: function() {
+                        $(this).css('opacity', 0);
+                    }
+                });
+            }
+        };
+
+        return {
+
+            fade: function(params, complete) {
+                $(params.next).css({
+                    opacity: 0,
+                    left: 0
+                }).show();
+                Utils.animate(params.next, {
+                    opacity: 1
+                },{
+                    duration: params.speed,
+                    complete: complete
+                });
+                if (params.prev) {
+                    $(params.prev).css('opacity',1).show();
+                    Utils.animate(params.prev, {
+                        opacity: 0
+                    },{
+                        duration: params.speed
+                    });
+                }
+            },
+
+            flash: function(params, complete) {
+                $(params.next).css({
+                    opacity: 0,
+                    left: 0
+                });
+                if (params.prev) {
+                    Utils.animate( params.prev, {
+                        opacity: 0
+                    },{
+                        duration: params.speed/2,
+                        complete: function() {
+                            Utils.animate( params.next, {
+                                opacity:1
+                            },{
+                                duration: params.speed,
+                                complete: complete
+                            });
+                        }
+                    });
+                } else {
+                    Utils.animate( params.next, {
+                        opacity: 1
+                    },{
+                        duration: params.speed,
+                        complete: complete
+                    });
+                }
+            },
+
+            pulse: function(params, complete) {
+                if (params.prev) {
+                    $(params.prev).hide();
+                }
+                $(params.next).css({
+                    opacity: 0,
+                    left: 0
+                }).show();
+                Utils.animate(params.next, {
+                    opacity:1
+                },{
+                    duration: params.speed,
+                    complete: complete
+                });
+            },
+
+            slide: function(params, complete) {
+                _slide.apply( this, Utils.array( arguments ) );
+            },
+
+            fadeslide: function(params, complete) {
+                _slide.apply( this, Utils.array( arguments ).concat( [true] ) );
+            },
+
+            doorslide: function(params, complete) {
+                _slide.apply( this, Utils.array( arguments ).concat( [false, true] ) );
+            }
+        };
+    }());
+
+/**
+    The main Galleria class
+
+    @class
+    @constructor
+
+    @example var gallery = new Galleria();
+
+    @author http://aino.se
+
+    @requires jQuery
+
+*/
+
+Galleria = function() {
+
+    var self = this;
+
+    // the theme used
+    this._theme = undef;
+
+    // internal options
+    this._options = {};
+
+    // flag for controlling play/pause
+    this._playing = false;
+
+    // internal interval for slideshow
+    this._playtime = 5000;
+
+    // internal variable for the currently active image
+    this._active = null;
+
+    // the internal queue, arrayified
+    this._queue = { length: 0 };
+
+    // the internal data array
+    this._data = [];
+
+    // the internal dom collection
+    this._dom = {};
+
+    // the internal thumbnails array
+    this._thumbnails = [];
+
+    // the internal layers array
+    this._layers = [];
+
+    // internal init flag
+    this._initialized = false;
+
+    // internal firstrun flag
+    this._firstrun = false;
+
+    // global stagewidth/height
+    this._stageWidth = 0;
+    this._stageHeight = 0;
+
+    // target holder
+    this._target = undef;
+
+    // instance id
+    this._id = Math.random();
+
+    // add some elements
+    var divs =  'container stage images image-nav image-nav-left image-nav-right ' +
+                'info info-text info-title info-description ' +
+                'thumbnails thumbnails-list thumbnails-container thumb-nav-left thumb-nav-right ' +
+                'loader counter tooltip',
+        spans = 'current total';
+
+    $.each( divs.split(' '), function( i, elemId ) {
+        self._dom[ elemId ] = Utils.create( 'galleria-' + elemId );
+    });
+
+    $.each( spans.split(' '), function( i, elemId ) {
+        self._dom[ elemId ] = Utils.create( 'galleria-' + elemId, 'span' );
+    });
+
+    // the internal keyboard object
+    // keeps reference of the keybinds and provides helper methods for binding keys
+    var keyboard = this._keyboard = {
+
+        keys : {
+            'UP': 38,
+            'DOWN': 40,
+            'LEFT': 37,
+            'RIGHT': 39,
+            'RETURN': 13,
+            'ESCAPE': 27,
+            'BACKSPACE': 8,
+            'SPACE': 32
+        },
+
+        map : {},
+
+        bound: false,
+
+        press: function(e) {
+            var key = e.keyCode || e.which;
+            if ( key in keyboard.map && typeof keyboard.map[key] === 'function' ) {
+                keyboard.map[key].call(self, e);
+            }
+        },
+
+        attach: function(map) {
+
+            var key, up;
+
+            for( key in map ) {
+                if ( map.hasOwnProperty( key ) ) {
+                    up = key.toUpperCase();
+                    if ( up in keyboard.keys ) {
+                        keyboard.map[ keyboard.keys[up] ] = map[key];
+                    } else {
+                        keyboard.map[ up ] = map[key];
+                    }
+                }
+            }
+            if ( !keyboard.bound ) {
+                keyboard.bound = true;
+                $doc.bind('keydown', keyboard.press);
+            }
+        },
+
+        detach: function() {
+            keyboard.bound = false;
+            keyboard.map = {};
+            $doc.unbind('keydown', keyboard.press);
+        }
+    };
+
+    // internal controls for keeping track of active / inactive images
+    var controls = this._controls = {
+
+        0: undef,
+
+        1: undef,
+
+        active : 0,
+
+        swap : function() {
+            controls.active = controls.active ? 0 : 1;
+        },
+
+        getActive : function() {
+            return controls[ controls.active ];
+        },
+
+        getNext : function() {
+            return controls[ 1 - controls.active ];
+        }
+    };
+
+    // internal carousel object
+    var carousel = this._carousel = {
+
+        // shortcuts
+        next: self.$('thumb-nav-right'),
+        prev: self.$('thumb-nav-left'),
+
+        // cache the width
+        width: 0,
+
+        // track the current position
+        current: 0,
+
+        // cache max value
+        max: 0,
+
+        // save all hooks for each width in an array
+        hooks: [],
+
+        // update the carousel
+        // you can run this method anytime, f.ex on window.resize
+        update: function() {
+            var w = 0,
+                h = 0,
+                hooks = [0];
+
+            $.each( self._thumbnails, function( i, thumb ) {
+                if ( thumb.ready ) {
+                    w += thumb.outerWidth || $( thumb.container ).outerWidth( true );
+                    hooks[ i+1 ] = w;
+                    h = Math.max( h, thumb.outerHeight || $( thumb.container).outerHeight( true ) );
+                }
+            });
+
+            self.$( 'thumbnails' ).css({
+                width: w,
+                height: h
+            });
+
+            carousel.max = w;
+            carousel.hooks = hooks;
+            carousel.width = self.$( 'thumbnails-list' ).width();
+            carousel.setClasses();
+
+            self.$( 'thumbnails-container' ).toggleClass( 'galleria-carousel', w > carousel.width );
+
+            // one extra calculation
+            carousel.width = self.$( 'thumbnails-list' ).width();
+
+            // todo: fix so the carousel moves to the left
+        },
+
+        bindControls: function() {
+
+            var i;
+
+            carousel.next.bind( 'click', function(e) {
+                e.preventDefault();
+
+                if ( self._options.carouselSteps === 'auto' ) {
+
+                    for ( i = carousel.current; i < carousel.hooks.length; i++ ) {
+                        if ( carousel.hooks[i] - carousel.hooks[ carousel.current ] > carousel.width ) {
+                            carousel.set(i - 2);
+                            break;
+                        }
+                    }
+
+                } else {
+                    carousel.set( carousel.current + self._options.carouselSteps);
+                }
+            });
+
+            carousel.prev.bind( 'click', function(e) {
+                e.preventDefault();
+
+                if ( self._options.carouselSteps === 'auto' ) {
+
+                    for ( i = carousel.current; i >= 0; i-- ) {
+                        if ( carousel.hooks[ carousel.current ] - carousel.hooks[i] > carousel.width ) {
+                            carousel.set( i + 2 );
+                            break;
+                        } else if ( i === 0 ) {
+                            carousel.set( 0 );
+                            break;
+                        }
+                    }
+                } else {
+                    carousel.set( carousel.current - self._options.carouselSteps );
+                }
+            });
+        },
+
+        // calculate and set positions
+        set: function( i ) {
+            i = Math.max( i, 0 );
+            while ( carousel.hooks[i - 1] + carousel.width >= carousel.max && i >= 0 ) {
+                i--;
+            }
+            carousel.current = i;
+            carousel.animate();
+        },
+
+        // get the last position
+        getLast: function(i) {
+            return ( i || carousel.current ) - 1;
+        },
+
+        // follow the active image
+        follow: function(i) {
+
+            //don't follow if position fits
+            if ( i === 0 || i === carousel.hooks.length - 2 ) {
+                carousel.set( i );
+                return;
+            }
+
+            // calculate last position
+            var last = carousel.current;
+            while( carousel.hooks[last] - carousel.hooks[ carousel.current ] <
+                   carousel.width && last <= carousel.hooks.length ) {
+                last ++;
+            }
+
+            // set position
+            if ( i - 1 < carousel.current ) {
+                carousel.set( i - 1 );
+            } else if ( i + 2 > last) {
+                carousel.set( i - last + carousel.current + 2 );
+            }
+        },
+
+        // helper for setting disabled classes
+        setClasses: function() {
+            carousel.prev.toggleClass( 'disabled', !carousel.current );
+            carousel.next.toggleClass( 'disabled', carousel.hooks[ carousel.current ] + carousel.width >= carousel.max );
+        },
+
+        // the animation method
+        animate: function(to) {
+            carousel.setClasses();
+            var num = carousel.hooks[ carousel.current ] * -1;
+
+            if ( isNaN( num ) ) {
+                return;
+            }
+
+            Utils.animate(self.get( 'thumbnails' ), {
+                left: num
+            },{
+                duration: self._options.carouselSpeed,
+                easing: self._options.easing,
+                queue: false
+            });
+        }
+    };
+
+    // tooltip control
+    // added in 1.2
+    var tooltip = this._tooltip = {
+
+        initialized : false,
+
+        open: false,
+
+        init: function() {
+
+            tooltip.initialized = true;
+
+            var css = '.galleria-tooltip{padding:3px 8px;max-width:50%;background:#ffe;color:#000;z-index:3;position:absolute;font-size:11px;line-height:1.3' +
+                      'opacity:0;box-shadow:0 0 2px rgba(0,0,0,.4);-moz-box-shadow:0 0 2px rgba(0,0,0,.4);-webkit-box-shadow:0 0 2px rgba(0,0,0,.4);}';
+
+            Utils.insertStyleTag(css);
+
+            self.$( 'tooltip' ).css('opacity', 0.8);
+            Utils.hide( self.get('tooltip') );
+
+        },
+
+        // move handler
+        move: function( e ) {
+            var mouseX = self.getMousePosition(e).x,
+                mouseY = self.getMousePosition(e).y,
+                $elem = self.$( 'tooltip' ),
+                x = mouseX,
+                y = mouseY,
+                height = $elem.outerHeight( true ) + 1,
+                width = $elem.outerWidth( true ),
+                limitY = height + 15;
+
+            var maxX = self.$( 'container').width() - width - 2,
+                maxY = self.$( 'container').height() - height - 2;
+
+            if ( !isNaN(x) && !isNaN(y) ) {
+
+                x += 10;
+                y -= 30;
+
+                x = Math.max( 0, Math.min( maxX, x ) );
+                y = Math.max( 0, Math.min( maxY, y ) );
+
+                if( mouseY < limitY ) {
+                    y = limitY;
+                }
+
+                $elem.css({ left: x, top: y });
+            }
+        },
+
+        // bind elements to the tooltip
+        // you can bind multiple elementIDs using { elemID : function } or { elemID : string }
+        // you can also bind single DOM elements using bind(elem, string)
+        bind: function( elem, value ) {
+
+            // todo: revise if alternative tooltip is needed for mobile devices
+            if (Galleria.TOUCH) {
+                return;
+            }
+
+            if (! tooltip.initialized ) {
+                tooltip.init();
+            }
+
+            var hover = function( elem, value) {
+
+                tooltip.define( elem, value );
+
+                $( elem ).hover(function() {
+
+                    Utils.clearTimer('switch_tooltip');
+                    self.$('container').unbind( 'mousemove', tooltip.move ).bind( 'mousemove', tooltip.move ).trigger( 'mousemove' );
+                    tooltip.show( elem );
+
+                    Galleria.utils.addTimer( 'tooltip', function() {
+                        self.$( 'tooltip' ).stop().show().animate({
+                            opacity:1
+                        });
+                        tooltip.open = true;
+
+                    }, tooltip.open ? 0 : 500);
+
+                }, function() {
+
+                    self.$( 'container' ).unbind( 'mousemove', tooltip.move );
+                    Utils.clearTimer( 'tooltip' );
+
+                    self.$( 'tooltip' ).stop().animate({
+                        opacity: 0
+                    }, 200, function() {
+
+                        self.$( 'tooltip' ).hide();
+
+                        Utils.addTimer('switch_tooltip', function() {
+                            tooltip.open = false;
+                        }, 1000);
+                    });
+                });
+            };
+
+            if ( typeof value === 'string' ) {
+                hover( ( elem in self._dom ? self.get( elem ) : elem ), value );
+            } else {
+                // asume elemID here
+                $.each( elem, function( elemID, val ) {
+                    hover( self.get(elemID), val );
+                });
+            }
+        },
+
+        show: function( elem ) {
+
+            elem = $( elem in self._dom ? self.get(elem) : elem );
+
+            var text = elem.data( 'tt' ),
+                mouseup = function( e ) {
+
+                    // attach a tiny settimeout to make sure the new tooltip is filled
+                    window.setTimeout( (function( ev ) {
+                        return function() {
+                            tooltip.move( ev );
+                        };
+                    }( e )), 10);
+
+                    elem.unbind( 'mouseup', mouseup );
+
+                };
+
+            text = typeof text === 'function' ? text() : text;
+
+            if ( ! text ) {
+                return;
+            }
+
+            self.$( 'tooltip' ).html( text.replace(/\s/, '&nbsp;') );
+
+            // trigger mousemove on mouseup in case of click
+            elem.bind( 'mouseup', mouseup );
+        },
+
+        define: function( elem, value ) {
+
+            // we store functions, not strings
+            if (typeof value !== 'function') {
+                var s = value;
+                value = function() {
+                    return s;
+                };
+            }
+
+            elem = $( elem in self._dom ? self.get(elem) : elem ).data('tt', value);
+
+            tooltip.show( elem );
+
+        }
+    };
+
+    // internal fullscreen control
+    var fullscreen = this._fullscreen = {
+
+        scrolled: 0,
+
+        crop: undef,
+
+        transition: undef,
+
+        active: false,
+
+        keymap: self._keyboard.map,
+
+        enter: function(callback) {
+
+            fullscreen.active = true;
+
+            // hide the image until rescale is complete
+            Utils.hide( self.getActiveImage() );
+
+            self.$( 'container' ).addClass( 'fullscreen' );
+
+            fullscreen.scrolled = $win.scrollTop();
+
+            // begin styleforce
+            Utils.forceStyles(self.get('container'), {
+                position: 'fixed',
+                top: 0,
+                left: 0,
+                width: '100%',
+                height: '100%',
+                zIndex: 10000
+            });
+
+            var htmlbody = {
+                    height: '100%',
+                    overflow: 'hidden',
+                    margin:0,
+                    padding:0
+                },
+
+                data = self.getData(),
+
+                options = self._options;
+
+            Utils.forceStyles( DOM().html, htmlbody );
+            Utils.forceStyles( DOM().body, htmlbody );
+
+            // temporarily attach some keys
+            // save the old ones first in a cloned object
+            fullscreen.keymap = $.extend({}, self._keyboard.map);
+
+            self.attachKeyboard({
+                escape: self.exitFullscreen,
+                right: self.next,
+                left: self.prev
+            });
+
+            // temporarily save the crop
+            fullscreen.crop = options.imageCrop;
+
+            // set fullscreen options
+            if ( options.fullscreenCrop != undef ) {
+                options.imageCrop = options.fullscreenCrop;
+            }
+
+            // swap to big image if it's different from the display image
+            if ( data && data.big && data.image !== data.big ) {
+                var big    = new Galleria.Picture(),
+                    cached = big.isCached( data.big ),
+                    index  = self.getIndex(),
+                    thumb  = self._thumbnails[ index ];
+
+                self.trigger( {
+                    type: Galleria.LOADSTART,
+                    cached: cached,
+                    rewind: false,
+                    index: index,
+                    imageTarget: self.getActiveImage(),
+                    thumbTarget: thumb
+                });
+
+                big.load( data.big, function( big ) {
+                    self._scaleImage( big, {
+                        complete: function( big ) {
+                            self.trigger({
+                                type: Galleria.LOADFINISH,
+                                cached: cached,
+                                index: index,
+                                rewind: false,
+                                imageTarget: big.image,
+                                thumbTarget: thumb
+                            });
+                            var image = self._controls.getActive().image;
+                            if ( image ) {
+                                $( image ).width( big.image.width ).height( big.image.height )
+                                    .attr( 'style', $( big.image ).attr('style') )
+                                    .attr( 'src', big.image.src );
+                            }
+                        }
+                    });
+                });
+            }
+
+            // init the first rescale and attach callbacks
+            self.rescale(function() {
+
+                Utils.addTimer('fullscreen_enter', function() {
+                    // show the image after 50 ms
+                    Utils.show( self.getActiveImage() );
+
+                    if (typeof callback === 'function') {
+                        callback.call( self );
+                    }
+
+                }, 100);
+
+                self.trigger( Galleria.FULLSCREEN_ENTER );
+            });
+
+            // bind the scaling to the resize event
+            $win.resize( function() {
+                fullscreen.scale();
+            } );
+        },
+
+        scale : function() {
+            self.rescale();
+        },
+
+        exit: function(callback) {
+
+            fullscreen.active = false;
+
+            Utils.hide( self.getActiveImage() );
+
+            self.$('container').removeClass( 'fullscreen' );
+
+            // revert all styles
+            Utils.revertStyles( self.get('container'), DOM().html, DOM().body );
+
+            // scroll back
+            window.scrollTo(0, fullscreen.scrolled);
+
+            // detach all keyboard events and apply the old keymap
+            self.detachKeyboard();
+            self.attachKeyboard( fullscreen.keymap );
+
+            // bring back cached options
+            self._options.imageCrop = fullscreen.crop;
+            //self._options.transition = fullscreen.transition;
+
+            // return to original image
+            var big = self.getData().big,
+                image = self._controls.getActive().image;
+
+            if ( big && big == image.src ) {
+
+                window.setTimeout(function(src) {
+                    return function() {
+                        image.src = src;
+                    };
+                }( self.getData().image ), 1 );
+
+            }
+
+            self.rescale(function() {
+                Utils.addTimer('fullscreen_exit', function() {
+
+                    // show the image after 50 ms
+                    Utils.show( self.getActiveImage() );
+
+                    if ( typeof callback === 'function' ) {
+                        callback.call( self );
+                    }
+
+                }, 50);
+
+                self.trigger( Galleria.FULLSCREEN_EXIT );
+            });
+
+
+            $win.unbind('resize', fullscreen.scale);
+        }
+    };
+
+    // the internal idle object for controlling idle states
+    var idle = this._idle = {
+
+        trunk: [],
+
+        bound: false,
+
+        add: function(elem, to) {
+            if (!elem) {
+                return;
+            }
+            if (!idle.bound) {
+                idle.addEvent();
+            }
+            elem = $(elem);
+
+            var from = {},
+                style;
+
+            for ( style in to ) {
+                if ( to.hasOwnProperty( style ) ) {
+                    from[ style ] = elem.css( style );
+                }
+            }
+            elem.data('idle', {
+                from: from,
+                to: to,
+                complete: true,
+                busy: false
+            });
+            idle.addTimer();
+            idle.trunk.push(elem);
+        },
+
+        remove: function(elem) {
+
+            elem = jQuery(elem);
+
+            $.each(idle.trunk, function(i, el) {
+                if ( el.length && !el.not(elem).length ) {
+                    self._idle.show(elem);
+                    self._idle.trunk.splice(i, 1);
+                }
+            });
+
+            if (!idle.trunk.length) {
+                idle.removeEvent();
+                Utils.clearTimer('idle');
+            }
+        },
+
+        addEvent : function() {
+            idle.bound = true;
+            self.$('container').bind('mousemove click', idle.showAll );
+        },
+
+        removeEvent : function() {
+            idle.bound = false;
+            self.$('container').unbind('mousemove click', idle.showAll );
+        },
+
+        addTimer : function() {
+            Utils.addTimer('idle', function() {
+                self._idle.hide();
+            }, self._options.idleTime );
+        },
+
+        hide : function() {
+
+            if ( !self._options.idleMode ) {
+                return;
+            }
+
+            self.trigger( Galleria.IDLE_ENTER );
+
+            $.each( idle.trunk, function(i, elem) {
+
+                var data = elem.data('idle');
+
+                if (! data) {
+                    return;
+                }
+
+                elem.data('idle').complete = false;
+
+                Utils.animate( elem, data.to, {
+                    duration: self._options.idleSpeed
+                });
+            });
+        },
+
+        showAll : function() {
+
+            Utils.clearTimer('idle');
+
+            $.each(self._idle.trunk, function( i, elem ) {
+                self._idle.show( elem );
+            });
+        },
+
+        show: function(elem) {
+
+            var data = elem.data('idle');
+
+            if (!data.busy && !data.complete) {
+
+                data.busy = true;
+
+                self.trigger( Galleria.IDLE_EXIT );
+
+                Utils.clearTimer( 'idle' );
+
+                Utils.animate( elem, data.from, {
+                    duration: self._options.idleSpeed/2,
+                    complete: function() {
+                        $(this).data('idle').busy = false;
+                        $(this).data('idle').complete = true;
+                    }
+                });
+
+            }
+            idle.addTimer();
+        }
+    };
+
+    // internal lightbox object
+    // creates a predesigned lightbox for simple popups of images in galleria
+    var lightbox = this._lightbox = {
+
+        width : 0,
+
+        height : 0,
+
+        initialized : false,
+
+        active : null,
+
+        image : null,
+
+        elems : {},
+
+        keymap: false,
+
+        init : function() {
+
+            // trigger the event
+            self.trigger( Galleria.LIGHTBOX_OPEN );
+
+            if ( lightbox.initialized ) {
+                return;
+            }
+            lightbox.initialized = true;
+
+            // create some elements to work with
+            var elems = 'overlay box content shadow title info close prevholder prev nextholder next counter image',
+                el = {},
+                op = self._options,
+                css = '',
+                abs = 'position:absolute;',
+                prefix = 'lightbox-',
+                cssMap = {
+                    overlay:    'position:fixed;display:none;opacity:'+op.overlayOpacity+';filter:alpha(opacity='+(op.overlayOpacity*100)+
+                                ');top:0;left:0;width:100%;height:100%;background:'+op.overlayBackground+';z-index:99990',
+                    box:        'position:fixed;display:none;width:400px;height:400px;top:50%;left:50%;margin-top:-200px;margin-left:-200px;z-index:99991',
+                    shadow:     abs+'background:#000;width:100%;height:100%;',
+                    content:    abs+'background-color:#fff;top:10px;left:10px;right:10px;bottom:10px;overflow:hidden',
+                    info:       abs+'bottom:10px;left:10px;right:10px;color:#444;font:11px/13px arial,sans-serif;height:13px',
+                    close:      abs+'top:10px;right:10px;height:20px;width:20px;background:#fff;text-align:center;cursor:pointer;color:#444;font:16px/22px arial,sans-serif;z-index:99999',
+                    image:      abs+'top:10px;left:10px;right:10px;bottom:30px;overflow:hidden;display:block;',
+                    prevholder: abs+'width:50%;top:0;bottom:40px;cursor:pointer;',
+                    nextholder: abs+'width:50%;top:0;bottom:40px;right:-1px;cursor:pointer;',
+                    prev:       abs+'top:50%;margin-top:-20px;height:40px;width:30px;background:#fff;left:20px;display:none;text-align:center;color:#000;font:bold 16px/36px arial,sans-serif',
+                    next:       abs+'top:50%;margin-top:-20px;height:40px;width:30px;background:#fff;right:20px;left:auto;display:none;font:bold 16px/36px arial,sans-serif;text-align:center;color:#000',
+                    title:      'float:left',
+                    counter:    'float:right;margin-left:8px;'
+                },
+                hover = function(elem) {
+                    return elem.hover(
+                        function() { $(this).css( 'color', '#bbb' ); },
+                        function() { $(this).css( 'color', '#444' ); }
+                    );
+                },
+                appends = {};
+
+            // IE8 fix for IE's transparent background event "feature"
+            if ( IE === 8 ) {
+                cssMap.nextholder += 'background:#000;filter:alpha(opacity=0);';
+                cssMap.prevholder += 'background:#000;filter:alpha(opacity=0);';
+            }
+
+            // create and insert CSS
+            $.each(cssMap, function( key, value ) {
+                css += '.galleria-'+prefix+key+'{'+value+'}';
+            });
+
+            Utils.insertStyleTag( css );
+
+            // create the elements
+            $.each(elems.split(' '), function( i, elemId ) {
+                self.addElement( 'lightbox-' + elemId );
+                el[ elemId ] = lightbox.elems[ elemId ] = self.get( 'lightbox-' + elemId );
+            });
+
+            // initiate the image
+            lightbox.image = new Galleria.Picture();
+
+            // append the elements
+            $.each({
+                    box: 'shadow content close prevholder nextholder',
+                    info: 'title counter',
+                    content: 'info image',
+                    prevholder: 'prev',
+                    nextholder: 'next'
+                }, function( key, val ) {
+                    var arr = [];
+                    $.each( val.split(' '), function( i, prop ) {
+                        arr.push( prefix + prop );
+                    });
+                    appends[ prefix+key ] = arr;
+            });
+
+            self.append( appends );
+
+            $( el.image ).append( lightbox.image.container );
+
+            $( DOM().body ).append( el.overlay, el.box );
+
+            Utils.optimizeTouch( el.box );
+
+            // add the prev/next nav and bind some controls
+
+            hover( $( el.close ).bind( 'click', lightbox.hide ).html('&#215;') );
+
+            $.each( ['Prev','Next'], function(i, dir) {
+
+                var $d = $( el[ dir.toLowerCase() ] ).html( /v/.test( dir ) ? '&#8249;&nbsp;' : '&nbsp;&#8250;' ),
+                    $e = $( el[ dir.toLowerCase()+'holder'] );
+
+                $e.bind( 'click', function() {
+                    lightbox[ 'show' + dir ]();
+                });
+
+                // IE7 and touch devices will simply show the nav
+                if ( IE < 8 || Galleria.TOUCH ) {
+                    $d.show();
+                    return;
+                }
+
+                $e.hover( function() {
+                    $d.show();
+                }, function(e) {
+                    $d.stop().fadeOut( 200 );
+                });
+
+            });
+            $( el.overlay ).bind( 'click', lightbox.hide );
+
+            // the lightbox animation is slow on ipad
+            if ( Galleria.IPAD ) {
+                self._options.lightboxTransitionSpeed = 0;
+            }
+
+        },
+
+        rescale: function(event) {
+
+            // calculate
+             var width = Math.min( $win.width()-40, lightbox.width ),
+                height = Math.min( $win.height()-60, lightbox.height ),
+                ratio = Math.min( width / lightbox.width, height / lightbox.height ),
+                destWidth = Math.round( lightbox.width * ratio ) + 40,
+                destHeight = Math.round( lightbox.height * ratio ) + 60,
+                to = {
+                    width: destWidth,
+                    height: destHeight,
+                    'margin-top': Math.ceil( destHeight / 2 ) *- 1,
+                    'margin-left': Math.ceil( destWidth / 2 ) *- 1
+                };
+
+            // if rescale event, don't animate
+            if ( event ) {
+                $( lightbox.elems.box ).css( to );
+            } else {
+                $( lightbox.elems.box ).animate( to, {
+                    duration: self._options.lightboxTransitionSpeed,
+                    easing: self._options.easing,
+                    complete: function() {
+                        var image = lightbox.image,
+                            speed = self._options.lightboxFadeSpeed;
+
+                        self.trigger({
+                            type: Galleria.LIGHTBOX_IMAGE,
+                            imageTarget: image.image
+                        });
+
+                        $( image.container ).show();
+
+                        Utils.show( image.image, speed );
+                        Utils.show( lightbox.elems.info, speed );
+                    }
+                });
+            }
+        },
+
+        hide: function() {
+
+            // remove the image
+            lightbox.image.image = null;
+
+            $win.unbind('resize', lightbox.rescale);
+
+            $( lightbox.elems.box ).hide();
+
+            Utils.hide( lightbox.elems.info );
+
+            self.detachKeyboard();
+            self.attachKeyboard( lightbox.keymap );
+
+            lightbox.keymap = false;
+
+            Utils.hide( lightbox.elems.overlay, 200, function() {
+                $( this ).hide().css( 'opacity', self._options.overlayOpacity );
+                self.trigger( Galleria.LIGHTBOX_CLOSE );
+            });
+        },
+
+        showNext: function() {
+            lightbox.show( self.getNext( lightbox.active ) );
+        },
+
+        showPrev: function() {
+            lightbox.show( self.getPrev( lightbox.active ) );
+        },
+
+        show: function(index) {
+
+            lightbox.active = index = typeof index === 'number' ? index : self.getIndex();
+
+            if ( !lightbox.initialized ) {
+                lightbox.init();
+            }
+
+            // temporarily attach some keys
+            // save the old ones first in a cloned object
+            if ( !lightbox.keymap ) {
+
+                lightbox.keymap = $.extend({}, self._keyboard.map);
+
+                self.attachKeyboard({
+                    escape: lightbox.hide,
+                    right: lightbox.showNext,
+                    left: lightbox.showPrev
+                });
+            }
+
+            $win.unbind('resize', lightbox.rescale );
+
+            var data = self.getData(index),
+                total = self.getDataLength(),
+                n = self.getNext( index ),
+                ndata, p, i;
+
+            Utils.hide( lightbox.elems.info );
+
+            try {
+                for ( i = self._options.preload; i > 0; i-- ) {
+                    p = new Galleria.Picture();
+                    ndata = self.getData( n );
+                    p.preload( 'big' in ndata ? ndata.big : ndata.image );
+                    n = self.getNext( n );
+                }
+            } catch(e) {}
+
+            lightbox.image.load( data.big || data.image, function( image ) {
+
+                lightbox.width = image.original.width;
+                lightbox.height = image.original.height;
+
+                $( image.image ).css({
+                    width: '100.5%',
+                    height: '100.5%',
+                    top: 0,
+                    zIndex: 99998
+                });
+
+                Utils.hide( image.image );
+
+                lightbox.elems.title.innerHTML = data.title || '';
+                lightbox.elems.counter.innerHTML = (index + 1) + ' / ' + total;
+                $win.resize( lightbox.rescale );
+                lightbox.rescale();
+            });
+
+            $( lightbox.elems.overlay ).show();
+            $( lightbox.elems.box ).show();
+        }
+    };
+
+    return this;
+};
+
+// end Galleria constructor
+
+Galleria.prototype = {
+
+    // bring back the constructor reference
+
+    constructor: Galleria,
+
+    /**
+        Use this function to initialize the gallery and start loading.
+        Should only be called once per instance.
+
+        @param {HTMLElement} target The target element
+        @param {Object} options The gallery options
+
+        @returns Instance
+    */
+
+    init: function( target, options ) {
+
+        var self = this;
+
+        options = _legacyOptions( options );
+
+        // save the original ingredients
+        this._original = {
+            target: target,
+            options: options,
+            data: null
+        };
+
+        // save the target here
+        this._target = this._dom.target = target.nodeName ? target : $( target ).get(0);
+
+        // push the instance
+        _instances.push( this );
+
+        // raise error if no target is detected
+        if ( !this._target ) {
+             Galleria.raise('Target not found.', true);
+             return;
+        }
+
+        // apply options
+        this._options = {
+            autoplay: false,
+            carousel: true,
+            carouselFollow: true,
+            carouselSpeed: 400,
+            carouselSteps: 'auto',
+            clicknext: false,
+            dataConfig : function( elem ) { return {}; },
+            dataSelector: 'img',
+            dataSource: this._target,
+            debug: undef,
+            dummy: undef, // 1.2.5
+            easing: 'galleria',
+            extend: function(options) {},
+            fullscreenCrop: undef, // 1.2.5
+            fullscreenDoubleTap: true, // 1.2.4 toggles fullscreen on double-tap for touch devices
+            fullscreenTransition: undef, // 1.2.6
+            height: 'auto',
+            idleMode: true, // 1.2.4 toggles idleMode
+            idleTime: 3000,
+            idleSpeed: 200,
+            imageCrop: false,
+            imageMargin: 0,
+            imagePan: false,
+            imagePanSmoothness: 12,
+            imagePosition: '50%',
+            imageTimeout: undef, // 1.2.5
+            initialTransition: undef, // 1.2.4, replaces transitionInitial
+            keepSource: false,
+            layerFollow: true, // 1.2.5
+            lightbox: false, // 1.2.3
+            lightboxFadeSpeed: 200,
+            lightboxTransitionSpeed: 200,
+            linkSourceImages: true,
+            maxScaleRatio: undef,
+            minScaleRatio: undef,
+            overlayOpacity: 0.85,
+            overlayBackground: '#0b0b0b',
+            pauseOnInteraction: true,
+            popupLinks: false,
+            preload: 2,
+            queue: true,
+            show: 0,
+            showInfo: true,
+            showCounter: true,
+            showImagenav: true,
+            swipe: true, // 1.2.4
+            thumbCrop: true,
+            thumbEventType: 'click',
+            thumbFit: true,
+            thumbMargin: 0,
+            thumbQuality: 'auto',
+            thumbnails: true,
+            touchTransition: undef, // 1.2.6
+            transition: 'fade',
+            transitionInitial: undef, // legacy, deprecate in 1.3. Use initialTransition instead.
+            transitionSpeed: 400,
+            useCanvas: false, // 1.2.4
+            width: 'auto'
+        };
+
+        // legacy support for transitionInitial
+        this._options.initialTransition = this._options.initialTransition || this._options.transitionInitial;
+
+        // turn off debug
+        if ( options && options.debug === false ) {
+            DEBUG = false;
+        }
+
+        // set timeout
+        if ( options && typeof options.imageTimeout === 'number' ) {
+            TIMEOUT = options.imageTimeout;
+        }
+
+        // set dummy
+        if ( options && typeof options.dummy === 'string' ) {
+            DUMMY = options.dummy;
+        }
+
+        // hide all content
+        $( this._target ).children().hide();
+
+        // now we just have to wait for the theme...
+        if ( typeof Galleria.theme === 'object' ) {
+            this._init();
+        } else {
+            // push the instance into the pool and run it when the theme is ready
+            _pool.push( this );
+        }
+
+        return this;
+    },
+
+    // this method should only be called once per instance
+    // for manipulation of data, use the .load method
+
+    _init: function() {
+
+        var self = this,
+            options = this._options;
+
+        if ( this._initialized ) {
+            Galleria.raise( 'Init failed: Gallery instance already initialized.' );
+            return this;
+        }
+
+        this._initialized = true;
+
+        if ( !Galleria.theme ) {
+            Galleria.raise( 'Init failed: No theme found.' );
+            return this;
+        }
+
+        // merge the theme & caller options
+        $.extend( true, options, Galleria.theme.defaults, this._original.options );
+
+        // check for canvas support
+        (function( can ) {
+
+            if ( !( 'getContext' in can ) ) {
+                can = null;
+                return;
+            }
+
+            _canvas = _canvas || {
+                elem: can,
+                context: can.getContext( '2d' ),
+                cache: {},
+                length: 0
+            };
+
+        }( doc.createElement( 'canvas' ) ) );
+
+        // bind the gallery to run when data is ready
+        this.bind( Galleria.DATA, function() {
+
+            // Warn for quirks mode
+            if ( Galleria.QUIRK ) {
+                Galleria.raise('Your page is in Quirks mode, Galleria may not render correctly. Please validate your HTML.');
+            }
+
+            // save the new data
+            this._original.data = this._data;
+
+            // lets show the counter here
+            this.get('total').innerHTML = this.getDataLength();
+
+            // cache the container
+            var $container = this.$( 'container' );
+
+            // the gallery is ready, let's just wait for the css
+            var num = { width: 0, height: 0 };
+            var testHeight = function() {
+                return self.$( 'stage' ).height();
+            };
+
+            // check container and thumbnail height
+            Utils.wait({
+                until: function() {
+
+                    // keep trying to get the value
+                    $.each(['width', 'height'], function( i, m ) {
+
+                        // first check if options is set
+
+                        if ( options[ m ] && typeof options[ m ] === 'number' ) {
+                            num[ m ] = options[ m ];
+                        } else {
+
+                            // else extract the measures from different sources and grab the highest value
+                            num[ m ] = Math.max(
+                                Utils.parseValue( $container.css( m ) ),         // 1. the container css
+                                Utils.parseValue( self.$( 'target' ).css( m ) ), // 2. the target css
+                                $container[ m ](),                               // 3. the container jQuery method
+                                self.$( 'target' )[ m ]()                        // 4. the container jQuery method
+                            );
+                        }
+
+                        // apply the new measures
+                        $container[ m ]( num[ m ] );
+
+                    });
+
+                    return testHeight() && num.width && num.height > 10;
+
+                },
+                success: function() {
+
+                    // for some strange reason, webkit needs a single setTimeout to play ball
+                    if ( Galleria.WEBKIT ) {
+                        window.setTimeout( function() {
+                            self._run();
+                        }, 1);
+                    } else {
+                        self._run();
+                    }
+                },
+                error: function() {
+
+                    // Height was probably not set, raise hard errors
+
+                    if ( testHeight() ) {
+                        Galleria.raise('Could not extract sufficient width/height of the gallery container. Traced measures: width:' + num.width + 'px, height: ' + num.height + 'px.', true);
+                    } else {
+                        Galleria.raise('Could not extract a stage height from the CSS. Traced height: ' + testHeight() + 'px.', true);
+                    }
+                },
+                timeout: 10000
+            });
+        });
+
+        // build the gallery frame
+        this.append({
+            'info-text' :
+                ['info-title', 'info-description'],
+            'info' :
+                ['info-text'],
+            'image-nav' :
+                ['image-nav-right', 'image-nav-left'],
+            'stage' :
+                ['images', 'loader', 'counter', 'image-nav'],
+            'thumbnails-list' :
+                ['thumbnails'],
+            'thumbnails-container' :
+                ['thumb-nav-left', 'thumbnails-list', 'thumb-nav-right'],
+            'container' :
+                ['stage', 'thumbnails-container', 'info', 'tooltip']
+        });
+
+        Utils.hide( this.$( 'counter' ).append(
+            this.get( 'current' ),
+            doc.createTextNode(' / '),
+            this.get( 'total' )
+        ) );
+
+        this.setCounter('&#8211;');
+
+        Utils.hide( self.get('tooltip') );
+
+        // add a notouch class on the container to prevent unwanted :hovers on touch devices
+        this.$( 'container' ).addClass( Galleria.TOUCH ? 'touch' : 'notouch' );
+
+        // add images to the controls
+        $.each( new Array(2), function( i ) {
+
+            // create a new Picture instance
+            var image = new Galleria.Picture();
+
+            // apply some styles, create & prepend overlay
+            $( image.container ).css({
+                position: 'absolute',
+                top: 0,
+                left: 0
+            }).prepend( self._layers[i] = $( Utils.create('galleria-layer') ).css({
+                position: 'absolute',
+                top:0, left:0, right:0, bottom:0,
+                zIndex:2
+            })[0] );
+
+            // append the image
+            self.$( 'images' ).append( image.container );
+
+            // reload the controls
+            self._controls[i] = image;
+
+        });
+
+        // some forced generic styling
+        this.$( 'images' ).css({
+            position: 'relative',
+            top: 0,
+            left: 0,
+            width: '100%',
+            height: '100%'
+        });
+
+        this.$( 'thumbnails, thumbnails-list' ).css({
+            overflow: 'hidden',
+            position: 'relative'
+        });
+
+        // bind image navigation arrows
+        this.$( 'image-nav-right, image-nav-left' ).bind( 'click', function(e) {
+
+            // tune the clicknext option
+            if ( options.clicknext ) {
+                e.stopPropagation();
+            }
+
+            // pause if options is set
+            if ( options.pauseOnInteraction ) {
+                self.pause();
+            }
+
+            // navigate
+            var fn = /right/.test( this.className ) ? 'next' : 'prev';
+            self[ fn ]();
+
+        });
+
+        // hide controls if chosen to
+        $.each( ['info','counter','image-nav'], function( i, el ) {
+            if ( options[ 'show' + el.substr(0,1).toUpperCase() + el.substr(1).replace(/-/,'') ] === false ) {
+                Utils.moveOut( self.get( el.toLowerCase() ) );
+            }
+        });
+
+        // load up target content
+        this.load();
+
+        // now it's usually safe to remove the content
+        // IE will never stop loading if we remove it, so let's keep it hidden for IE (it's usually fast enough anyway)
+        if ( !options.keepSource && !IE ) {
+            this._target.innerHTML = '';
+        }
+
+        // re-append the errors, if they happened before clearing
+        if ( this.get( 'errors' ) ) {
+            this.appendChild( 'target', 'errors' );
+        }
+
+        // append the gallery frame
+        this.appendChild( 'target', 'container' );
+
+        // parse the carousel on each thumb load
+        if ( options.carousel ) {
+            var count = 0,
+                show = options.show;
+            this.bind( Galleria.THUMBNAIL, function() {
+                this.updateCarousel();
+                if ( ++count == this.getDataLength() && typeof show == 'number' && show > 0 ) {
+                    this._carousel.follow( show );
+                }
+            });
+        }
+
+        // bind swipe gesture
+        if ( options.swipe ) {
+
+            (function( images ) {
+
+                var swipeStart = [0,0],
+                    swipeStop = [0,0],
+                    limitX = 30,
+                    limitY = 100,
+                    multi = false,
+                    tid = 0,
+                    data,
+                    ev = {
+                        start: 'touchstart',
+                        move: 'touchmove',
+                        stop: 'touchend'
+                    },
+                    getData = function(e) {
+                        return e.originalEvent.touches ? e.originalEvent.touches[0] : e;
+                    },
+                    moveHandler = function( e ) {
+
+                        if ( e.originalEvent.touches && e.originalEvent.touches.length > 1 ) {
+                            return;
+                        }
+
+                        data = getData( e );
+                        swipeStop = [ data.pageX, data.pageY ];
+
+                        if ( !swipeStart[0] ) {
+                            swipeStart = swipeStop;
+                        }
+
+                        if ( Math.abs( swipeStart[0] - swipeStop[0] ) > 10 ) {
+                            e.preventDefault();
+                        }
+                    },
+                    upHandler = function( e ) {
+
+                        images.unbind( ev.move, moveHandler );
+
+                        // if multitouch (possibly zooming), abort
+                        if ( ( e.originalEvent.touches && e.originalEvent.touches.length ) || multi ) {
+                            multi = !multi;
+                            return;
+                        }
+
+                        if ( Utils.timestamp() - tid < 1000 &&
+                             Math.abs( swipeStart[0] - swipeStop[0] ) > limitX &&
+                             Math.abs( swipeStart[1] - swipeStop[1] ) < limitY ) {
+
+                            e.preventDefault();
+                            self[ swipeStart[0] > swipeStop[0] ? 'next' : 'prev' ]();
+                        }
+
+                        swipeStart = swipeStop = [0,0];
+                    };
+
+                images.bind(ev.start, function(e) {
+
+                    if ( e.originalEvent.touches && e.originalEvent.touches.length > 1 ) {
+                        return;
+                    }
+
+                    data = getData(e);
+                    tid = Utils.timestamp();
+                    swipeStart = swipeStop = [ data.pageX, data.pageY ];
+                    images.bind(ev.move, moveHandler ).one(ev.stop, upHandler);
+
+                });
+
+            }( self.$( 'images' ) ));
+
+            // double-tap/click fullscreen toggle
+
+            if ( options.fullscreenDoubleTap ) {
+
+                this.$( 'stage' ).bind( 'touchstart', (function() {
+                    var last, cx, cy, lx, ly, now,
+                        getData = function(e) {
+                            return e.originalEvent.touches ? e.originalEvent.touches[0] : e;
+                        };
+                    return function(e) {
+                        now = Galleria.utils.timestamp();
+                        cx = getData(e).pageX;
+                        cy = getData(e).pageY;
+                        if ( ( now - last < 500 ) && ( cx - lx < 20) && ( cy - ly < 20) ) {
+                            self.toggleFullscreen();
+                            e.preventDefault();
+                            self.$( 'stage' ).unbind( 'touchend', arguments.callee );
+                            return;
+                        }
+                        last = now;
+                        lx = cx;
+                        ly = cy;
+                    };
+                }()));
+            }
+
+        }
+
+        // optimize touch for container
+        Utils.optimizeTouch( this.get( 'container' ) );
+
+        return this;
+    },
+
+    // Creates the thumbnails and carousel
+    // can be used at any time, f.ex when the data object is manipulated
+
+    _createThumbnails : function() {
+
+        this.get( 'total' ).innerHTML = this.getDataLength();
+
+        var i,
+            src,
+            thumb,
+            data,
+
+            $container,
+
+            self = this,
+            o = this._options,
+
+            // get previously active thumbnail, if exists
+            active = (function() {
+                var a = self.$('thumbnails').find('.active');
+                if ( !a.length ) {
+                    return false;
+                }
+                return a.find('img').attr('src');
+            }()),
+
+            // cache the thumbnail option
+            optval = typeof o.thumbnails === 'string' ? o.thumbnails.toLowerCase() : null,
+
+            // move some data into the instance
+            // for some reason, jQuery cant handle css(property) when zooming in FF, breaking the gallery
+            // so we resort to getComputedStyle for browsers who support it
+            getStyle = function( prop ) {
+                return doc.defaultView && doc.defaultView.getComputedStyle ?
+                    doc.defaultView.getComputedStyle( thumb.container, null )[ prop ] :
+                    $container.css( prop );
+            },
+
+            fake = function(image, index, container) {
+                return function() {
+                    $( container ).append( image );
+                    self.trigger({
+                        type: Galleria.THUMBNAIL,
+                        thumbTarget: image,
+                        index: index
+                    });
+                };
+            },
+
+            onThumbEvent = function( e ) {
+
+                // pause if option is set
+                if ( o.pauseOnInteraction ) {
+                    self.pause();
+                }
+
+                // extract the index from the data
+                var index = $( e.currentTarget ).data( 'index' );
+                if ( self.getIndex() !== index ) {
+                    self.show( index );
+                }
+
+                e.preventDefault();
+            },
+
+            onThumbLoad = function( thumb ) {
+
+                // scale when ready
+                thumb.scale({
+                    width:    thumb.data.width,
+                    height:   thumb.data.height,
+                    crop:     o.thumbCrop,
+                    margin:   o.thumbMargin,
+                    canvas:   o.useCanvas,
+                    complete: function( thumb ) {
+
+                        // shrink thumbnails to fit
+                        var top = ['left', 'top'],
+                            arr = ['Width', 'Height'],
+                            m,
+                            css;
+
+                        // calculate shrinked positions
+                        $.each(arr, function( i, measure ) {
+                            m = measure.toLowerCase();
+                            if ( (o.thumbCrop !== true || o.thumbCrop === m ) && o.thumbFit ) {
+                                css = {};
+                                css[ m ] = thumb[ m ];
+                                $( thumb.container ).css( css );
+                                css = {};
+                                css[ top[ i ] ] = 0;
+                                $( thumb.image ).css( css );
+                            }
+
+                            // cache outer measures
+                            thumb[ 'outer' + measure ] = $( thumb.container )[ 'outer' + measure ]( true );
+                        });
+
+                        // set high quality if downscale is moderate
+                        Utils.toggleQuality( thumb.image,
+                            o.thumbQuality === true ||
+                            ( o.thumbQuality === 'auto' && thumb.original.width < thumb.width * 3 )
+                        );
+
+                        // trigger the THUMBNAIL event
+                        self.trigger({
+                            type: Galleria.THUMBNAIL,
+                            thumbTarget: thumb.image,
+                            index: thumb.data.order
+                        });
+                    }
+                });
+            };
+
+        this._thumbnails = [];
+
+        this.$( 'thumbnails' ).empty();
+
+        // loop through data and create thumbnails
+        for( i = 0; this._data[ i ]; i++ ) {
+
+            data = this._data[ i ];
+
+            if ( o.thumbnails === true ) {
+
+                // add a new Picture instance
+                thumb = new Galleria.Picture(i);
+
+                // get source from thumb or image
+                src = data.thumb || data.image;
+
+                // append the thumbnail
+                this.$( 'thumbnails' ).append( thumb.container );
+
+                // cache the container
+                $container = $( thumb.container );
+
+                thumb.data = {
+                    width  : Utils.parseValue( getStyle( 'width' ) ),
+                    height : Utils.parseValue( getStyle( 'height' ) ),
+                    order  : i
+                };
+
+                // grab & reset size for smoother thumbnail loads
+                if ( o.thumbFit && o.thumbCrop !== true ) {
+                    $container.css( { width: 0, height: 0 } );
+                } else {
+                    $container.css( { width: thumb.data.width, height: thumb.data.height } );
+                }
+
+                // load the thumbnail
+                thumb.load( src, onThumbLoad );
+
+                // preload all images here
+                if ( o.preload === 'all' ) {
+                    thumb.preload( data.image );
+                }
+
+            // create empty spans if thumbnails is set to 'empty'
+            } else if ( optval === 'empty' || optval === 'numbers' ) {
+
+                thumb = {
+                    container:  Utils.create( 'galleria-image' ),
+                    image: Utils.create( 'img', 'span' ),
+                    ready: true
+                };
+
+                // create numbered thumbnails
+                if ( optval === 'numbers' ) {
+                    $( thumb.image ).text( i + 1 );
+                }
+
+                this.$( 'thumbnails' ).append( thumb.container );
+
+                // we need to "fake" a loading delay before we append and trigger
+                // 50+ should be enough
+
+                window.setTimeout( ( fake )( thumb.image, i, thumb.container ), 50 + ( i*20 ) );
+
+            // create null object to silent errors
+            } else {
+                thumb = {
+                    container: null,
+                    image: null
+                };
+            }
+
+            // add events for thumbnails
+            // you can control the event type using thumb_event_type
+            // we'll add the same event to the source if it's kept
+
+            $( thumb.container ).add( o.keepSource && o.linkSourceImages ? data.original : null )
+                .data('index', i).bind( o.thumbEventType, onThumbEvent );
+
+            if (active === src) {
+                $( thumb.container ).addClass( 'active' );
+            }
+
+            this._thumbnails.push( thumb );
+        }
+    },
+
+    // the internal _run method should be called after loading data into galleria
+    // makes sure the gallery has proper measurements before postrun & ready
+    _run : function() {
+
+        var self = this;
+
+        self._createThumbnails();
+
+        // make sure we have a stageHeight && stageWidth
+
+        Utils.wait({
+
+            until: function() {
+
+                // Opera crap
+                if ( Galleria.OPERA ) {
+                    self.$( 'stage' ).css( 'display', 'inline-block' );
+                }
+
+                self._stageWidth  = self.$( 'stage' ).width();
+                self._stageHeight = self.$( 'stage' ).height();
+
+                return( self._stageWidth &&
+                        self._stageHeight > 50 ); // what is an acceptable height?
+            },
+
+            success: function() {
+
+                // save the instance
+                _galleries.push( self );
+
+                // postrun some stuff after the gallery is ready
+
+                // show counter
+                Utils.show( self.get('counter') );
+
+                // bind carousel nav
+                if ( self._options.carousel ) {
+                    self._carousel.bindControls();
+                }
+
+                // start autoplay
+                if ( self._options.autoplay ) {
+
+                    self.pause();
+
+                    if ( typeof self._options.autoplay === 'number' ) {
+                        self._playtime = self._options.autoplay;
+                    }
+
+                    self.trigger( Galleria.PLAY );
+                    self._playing = true;
+                }
+                // if second load, just do the show and return
+                if ( self._firstrun ) {
+                    if ( typeof self._options.show === 'number' ) {
+                        self.show( self._options.show );
+                    }
+                    return;
+                }
+
+                self._firstrun = true;
+
+                // bind clicknext
+                if ( self._options.clicknext && !Galleria.TOUCH ) {
+                    $.each( self._data, function( i, data ) {
+                        delete data.link;
+                    });
+                    self.$( 'stage' ).css({ cursor : 'pointer' }).bind( 'click', function(e) {
+                        // pause if options is set
+                        if ( self._options.pauseOnInteraction ) {
+                            self.pause();
+                        }
+                        self.next();
+                    });
+                }
+
+                // initialize the History plugin
+                if ( Galleria.History ) {
+
+                    // bind the show method
+                    Galleria.History.change(function( value ) {
+
+                        // if ID is NaN, the user pressed back from the first image
+                        // return to previous address
+                        if ( isNaN( value ) ) {
+                            window.history.go(-1);
+
+                        // else show the image
+                        } else {
+                            self.show( value, undef, true );
+                        }
+                    });
+                }
+
+                // Trigger Galleria.ready
+                $.each( Galleria.ready.callbacks, function() {
+                    this.call( self, self._options );
+                });
+
+                self.trigger( Galleria.READY );
+
+                // call the theme init method
+                Galleria.theme.init.call( self, self._options );
+
+                // call the extend option
+                self._options.extend.call( self, self._options );
+
+                // show the initial image
+                // first test for permalinks in history
+                if ( /^[0-9]{1,4}$/.test( HASH ) && Galleria.History ) {
+                    self.show( HASH, undef, true );
+
+                } else if( self._data[ self._options.show ] ) {
+                    self.show( self._options.show );
+                }
+            },
+
+            error: function() {
+                Galleria.raise('Stage width or height is too small to show the gallery. Traced measures: width:' + self._stageWidth + 'px, height: ' + self._stageHeight + 'px.', true);
+            }
+
+        });
+    },
+
+    /**
+        Loads data into the gallery.
+        You can call this method on an existing gallery to reload the gallery with new data.
+
+        @param {Array|string} source Optional JSON array of data or selector of where to find data in the document.
+        Defaults to the Galleria target or dataSource option.
+
+        @param {string} selector Optional element selector of what elements to parse.
+        Defaults to 'img'.
+
+        @param {Function} [config] Optional function to modify the data extraction proceedure from the selector.
+        See the data_config option for more information.
+
+        @returns Instance
+    */
+
+    load : function( source, selector, config ) {
+
+        var self = this;
+
+        // empty the data array
+        this._data = [];
+
+        // empty the thumbnails
+        this._thumbnails = [];
+        this.$('thumbnails').empty();
+
+        // shorten the arguments
+        if ( typeof selector === 'function' ) {
+            config = selector;
+            selector = null;
+        }
+
+        // use the source set by target
+        source = source || this._options.dataSource;
+
+        // use selector set by option
+        selector = selector || this._options.dataSelector;
+
+        // use the data_config set by option
+        config = config || this._options.dataConfig;
+
+        // if source is a true object, make it into an array
+        if( /^function Object/.test( source.constructor ) ) {
+            source = [source];
+        }
+
+        // check if the data is an array already
+        if ( source.constructor === Array ) {
+            if ( this.validate( source ) ) {
+
+                this._data = source;
+                this._parseData().trigger( Galleria.DATA );
+
+            } else {
+                Galleria.raise( 'Load failed: JSON Array not valid.' );
+            }
+            return this;
+        }
+
+        // loop through images and set data
+        $( source ).find( selector ).each( function( i, img ) {
+            img = $( img );
+            var data = {},
+                parent = img.parent(),
+                href = parent.attr( 'href' ),
+                rel  = parent.attr( 'rel' );
+
+            if ( href ) {
+                data.image = data.big = href;
+            }
+            if ( rel ) {
+                data.big = rel;
+            }
+
+            // mix default extractions with the hrefs and config
+            // and push it into the data array
+            self._data.push( $.extend({
+
+                title:       img.attr('title') || '',
+                thumb:       img.attr('src'),
+                image:       img.attr('src'),
+                big:         img.attr('src'),
+                description: img.attr('alt') || '',
+                link:        img.attr('longdesc'),
+                original:    img.get(0) // saved as a reference
+
+            }, data, config( img ) ) );
+
+        });
+        // trigger the DATA event and return
+        if ( this.getDataLength() ) {
+            this.trigger( Galleria.DATA );
+        } else {
+            Galleria.raise('Load failed: no data found.');
+        }
+        return this;
+
+    },
+
+    // make sure the data works properly
+    _parseData : function() {
+
+        var self = this;
+
+        $.each( this._data, function( i, data ) {
+            // copy image as thumb if no thumb exists
+            if ( 'thumb' in data === false ) {
+                self._data[ i ].thumb = data.image;
+            }
+            // copy image as big image if no biggie exists
+            if ( !'big' in data ) {
+                self._data[ i ].big = data.image;
+            }
+        });
+
+        return this;
+    },
+
+    /**
+        Adds and/or removes images from the gallery
+        Works just like Array.splice
+        https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/splice
+
+        @example this.splice( 2, 4 ); // removes 4 images after the second image
+
+        @returns Instance
+    */
+
+    splice: function() {
+        Array.prototype.splice.apply( this._data, Utils.array( arguments ) );
+        return this._parseData()._createThumbnails();
+    },
+
+    /**
+        Append images to the gallery
+        Works just like Array.push
+        https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/push
+
+        @example this.push({ image: 'image1.jpg' }); // appends the image to the gallery
+
+        @returns Instance
+    */
+
+    push: function() {
+        Array.prototype.push.apply( this._data, Utils.array( arguments ) );
+        return this._parseData()._createThumbnails();
+    },
+
+    _getActive: function() {
+        return this._controls.getActive();
+    },
+
+    validate : function( data ) {
+        // todo: validate a custom data array
+        return true;
+    },
+
+    /**
+        Bind any event to Galleria
+
+        @param {string} type The Event type to listen for
+        @param {Function} fn The function to execute when the event is triggered
+
+        @example this.bind( 'image', function() { Galleria.log('image shown') });
+
+        @returns Instance
+    */
+
+    bind : function(type, fn) {
+
+        // allow 'image' instead of Galleria.IMAGE
+        type = _patchEvent( type );
+
+        this.$( 'container' ).bind( type, this.proxy(fn) );
+        return this;
+    },
+
+    /**
+        Unbind any event to Galleria
+
+        @param {string} type The Event type to forget
+
+        @returns Instance
+    */
+
+    unbind : function(type) {
+
+        type = _patchEvent( type );
+
+        this.$( 'container' ).unbind( type );
+        return this;
+    },
+
+    /**
+        Manually trigger a Galleria event
+
+        @param {string} type The Event to trigger
+
+        @returns Instance
+    */
+
+    trigger : function( type ) {
+
+        type = typeof type === 'object' ?
+            $.extend( type, { scope: this } ) :
+            { type: _patchEvent( type ), scope: this };
+
+        this.$( 'container' ).trigger( type );
+
+        return this;
+    },
+
+    /**
+        Assign an "idle state" to any element.
+        The idle state will be applied after a certain amount of idle time
+        Useful to hide f.ex navigation when the gallery is inactive
+
+        @param {HTMLElement|string} elem The Dom node or selector to apply the idle state to
+        @param {Object} styles the CSS styles to apply
+
+        @example addIdleState( this.get('image-nav'), { opacity: 0 });
+        @example addIdleState( '.galleria-image-nav', { top: -200 });
+
+        @returns Instance
+    */
+
+    addIdleState: function( elem, styles ) {
+        this._idle.add.apply( this._idle, Utils.array( arguments ) );
+        return this;
+    },
+
+    /**
+        Removes any idle state previously set using addIdleState()
+
+        @param {HTMLElement|string} elem The Dom node or selector to remove the idle state from.
+
+        @returns Instance
+    */
+
+    removeIdleState: function( elem ) {
+        this._idle.remove.apply( this._idle, Utils.array( arguments ) );
+        return this;
+    },
+
+    /**
+        Force Galleria to enter idle mode.
+
+        @returns Instance
+    */
+
+    enterIdleMode: function() {
+        this._idle.hide();
+        return this;
+    },
+
+    /**
+        Force Galleria to exit idle mode.
+
+        @returns Instance
+    */
+
+    exitIdleMode: function() {
+        this._idle.showAll();
+        return this;
+    },
+
+    /**
+        Enter FullScreen mode
+
+        @param {Function} callback the function to be executed when the fullscreen mode is fully applied.
+
+        @returns Instance
+    */
+
+    enterFullscreen: function( callback ) {
+        this._fullscreen.enter.apply( this, Utils.array( arguments ) );
+        return this;
+    },
+
+    /**
+        Exits FullScreen mode
+
+        @param {Function} callback the function to be executed when the fullscreen mode is fully applied.
+
+        @returns Instance
+    */
+
+    exitFullscreen: function( callback ) {
+        this._fullscreen.exit.apply( this, Utils.array( arguments ) );
+        return this;
+    },
+
+    /**
+        Toggle FullScreen mode
+
+        @param {Function} callback the function to be executed when the fullscreen mode is fully applied or removed.
+
+        @returns Instance
+    */
+
+    toggleFullscreen: function( callback ) {
+        this._fullscreen[ this.isFullscreen() ? 'exit' : 'enter'].apply( this, Utils.array( arguments ) );
+        return this;
+    },
+
+    /**
+        Adds a tooltip to any element.
+        You can also call this method with an object as argument with elemID:value pairs to apply tooltips to (see examples)
+
+        @param {HTMLElement} elem The DOM Node to attach the event to
+        @param {string|Function} value The tooltip message. Can also be a function that returns a string.
+
+        @example this.bindTooltip( this.get('thumbnails'), 'My thumbnails');
+        @example this.bindTooltip( this.get('thumbnails'), function() { return 'My thumbs' });
+        @example this.bindTooltip( { image_nav: 'Navigation' });
+
+        @returns Instance
+    */
+
+    bindTooltip: function( elem, value ) {
+        this._tooltip.bind.apply( this._tooltip, Utils.array(arguments) );
+        return this;
+    },
+
+    /**
+        Note: this method is deprecated. Use refreshTooltip() instead.
+
+        Redefine a tooltip.
+        Use this if you want to re-apply a tooltip value to an already bound tooltip element.
+
+        @param {HTMLElement} elem The DOM Node to attach the event to
+        @param {string|Function} value The tooltip message. Can also be a function that returns a string.
+
+        @returns Instance
+    */
+
+    defineTooltip: function( elem, value ) {
+        this._tooltip.define.apply( this._tooltip, Utils.array(arguments) );
+        return this;
+    },
+
+    /**
+        Refresh a tooltip value.
+        Use this if you want to change the tooltip value at runtime, f.ex if you have a play/pause toggle.
+
+        @param {HTMLElement} elem The DOM Node that has a tooltip that should be refreshed
+
+        @returns Instance
+    */
+
+    refreshTooltip: function( elem ) {
+        this._tooltip.show.apply( this._tooltip, Utils.array(arguments) );
+        return this;
+    },
+
+    /**
+        Open a pre-designed lightbox with the currently active image.
+        You can control some visuals using gallery options.
+
+        @returns Instance
+    */
+
+    openLightbox: function() {
+        this._lightbox.show.apply( this._lightbox, Utils.array( arguments ) );
+        return this;
+    },
+
+    /**
+        Close the lightbox.
+
+        @returns Instance
+    */
+
+    closeLightbox: function() {
+        this._lightbox.hide.apply( this._lightbox, Utils.array( arguments ) );
+        return this;
+    },
+
+    /**
+        Get the currently active image element.
+
+        @returns {HTMLElement} The image element
+    */
+
+    getActiveImage: function() {
+        return this._getActive().image || undef;
+    },
+
+    /**
+        Get the currently active thumbnail element.
+
+        @returns {HTMLElement} The thumbnail element
+    */
+
+    getActiveThumb: function() {
+        return this._thumbnails[ this._active ].image || undef;
+    },
+
+    /**
+        Get the mouse position relative to the gallery container
+
+        @param e The mouse event
+
+        @example
+
+var gallery = this;
+$(document).mousemove(function(e) {
+    console.log( gallery.getMousePosition(e).x );
+});
+
+        @returns {Object} Object with x & y of the relative mouse postion
+    */
+
+    getMousePosition : function(e) {
+        return {
+            x: e.pageX - this.$( 'container' ).offset().left,
+            y: e.pageY - this.$( 'container' ).offset().top
+        };
+    },
+
+    /**
+        Adds a panning effect to the image
+
+        @param img The optional image element. If not specified it takes the currently active image
+
+        @returns Instance
+    */
+
+    addPan : function( img ) {
+
+        if ( this._options.imageCrop === false ) {
+            return;
+        }
+
+        img = $( img || this.getActiveImage() );
+
+        // define some variables and methods
+        var self   = this,
+            x      = img.width() / 2,
+            y      = img.height() / 2,
+            destX  = parseInt( img.css( 'left' ), 10 ),
+            destY  = parseInt( img.css( 'top' ), 10 ),
+            curX   = destX || 0,
+            curY   = destY || 0,
+            distX  = 0,
+            distY  = 0,
+            active = false,
+            ts     = Utils.timestamp(),
+            cache  = 0,
+            move   = 0,
+
+            // positions the image
+            position = function( dist, cur, pos ) {
+                if ( dist > 0 ) {
+                    move = Math.round( Math.max( dist * -1, Math.min( 0, cur ) ) );
+                    if ( cache !== move ) {
+
+                        cache = move;
+
+                        if ( IE === 8 ) { // scroll is faster for IE
+                            img.parent()[ 'scroll' + pos ]( move * -1 );
+                        } else {
+                            var css = {};
+                            css[ pos.toLowerCase() ] = move;
+                            img.css(css);
+                        }
+                    }
+                }
+            },
+
+            // calculates mouse position after 50ms
+            calculate = function(e) {
+                if (Utils.timestamp() - ts < 50) {
+                    return;
+                }
+                active = true;
+                x = self.getMousePosition(e).x;
+                y = self.getMousePosition(e).y;
+            },
+
+            // the main loop to check
+            loop = function(e) {
+
+                if (!active) {
+                    return;
+                }
+
+                distX = img.width() - self._stageWidth;
+                distY = img.height() - self._stageHeight;
+                destX = x / self._stageWidth * distX * -1;
+                destY = y / self._stageHeight * distY * -1;
+                curX += ( destX - curX ) / self._options.imagePanSmoothness;
+                curY += ( destY - curY ) / self._options.imagePanSmoothness;
+
+                position( distY, curY, 'Top' );
+                position( distX, curX, 'Left' );
+
+            };
+
+        // we need to use scroll in IE8 to speed things up
+        if ( IE === 8 ) {
+
+            img.parent().scrollTop( curY * -1 ).scrollLeft( curX * -1 );
+            img.css({
+                top: 0,
+                left: 0
+            });
+
+        }
+
+        // unbind and bind event
+        this.$( 'stage' ).unbind( 'mousemove', calculate ).bind( 'mousemove', calculate );
+
+        // loop the loop
+        Utils.addTimer('pan', loop, 50, true);
+
+        return this;
+    },
+
+    /**
+        Brings the scope into any callback
+
+        @param fn The callback to bring the scope into
+        @param scope Optional scope to bring
+
+        @example $('#fullscreen').click( this.proxy(function() { this.enterFullscreen(); }) )
+
+        @returns {Function} Return the callback with the gallery scope
+    */
+
+    proxy : function( fn, scope ) {
+        if ( typeof fn !== 'function' ) {
+            return function() {};
+        }
+        scope = scope || this;
+        return function() {
+            return fn.apply( scope, Utils.array( arguments ) );
+        };
+    },
+
+    /**
+        Removes the panning effect set by addPan()
+
+        @returns Instance
+    */
+
+    removePan: function() {
+
+        // todo: doublecheck IE8
+
+        this.$( 'stage' ).unbind( 'mousemove' );
+
+        Utils.clearTimer( 'pan' );
+
+        return this;
+    },
+
+    /**
+        Adds an element to the Galleria DOM array.
+        When you add an element here, you can access it using element ID in many API calls
+
+        @param {string} id The element ID you wish to use. You can add many elements by adding more arguments.
+
+        @example addElement('mybutton');
+        @example addElement('mybutton','mylink');
+
+        @returns Instance
+    */
+
+    addElement : function( id ) {
+
+        var dom = this._dom;
+
+        $.each( Utils.array(arguments), function( i, blueprint ) {
+           dom[ blueprint ] = Utils.create( 'galleria-' + blueprint );
+        });
+
+        return this;
+    },
+
+    /**
+        Attach keyboard events to Galleria
+
+        @param {Object} map The map object of events.
+        Possible keys are 'UP', 'DOWN', 'LEFT', 'RIGHT', 'RETURN', 'ESCAPE', 'BACKSPACE', and 'SPACE'.
+
+        @example
+
+this.attachKeyboard({
+    right: this.next,
+    left: this.prev,
+    up: function() {
+        console.log( 'up key pressed' )
+    }
+});
+
+        @returns Instance
+    */
+
+    attachKeyboard : function( map ) {
+        this._keyboard.attach.apply( this._keyboard, Utils.array( arguments ) );
+        return this;
+    },
+
+    /**
+        Detach all keyboard events to Galleria
+
+        @returns Instance
+    */
+
+    detachKeyboard : function() {
+        this._keyboard.detach.apply( this._keyboard, Utils.array( arguments ) );
+        return this;
+    },
+
+    /**
+        Fast helper for appending galleria elements that you added using addElement()
+
+        @param {string} parentID The parent element ID where the element will be appended
+        @param {string} childID the element ID that should be appended
+
+        @example this.addElement('myElement');
+        this.appendChild( 'info', 'myElement' );
+
+        @returns Instance
+    */
+
+    appendChild : function( parentID, childID ) {
+        this.$( parentID ).append( this.get( childID ) || childID );
+        return this;
+    },
+
+    /**
+        Fast helper for prepending galleria elements that you added using addElement()
+
+        @param {string} parentID The parent element ID where the element will be prepended
+        @param {string} childID the element ID that should be prepended
+
+        @example
+
+this.addElement('myElement');
+this.prependChild( 'info', 'myElement' );
+
+        @returns Instance
+    */
+
+    prependChild : function( parentID, childID ) {
+        this.$( parentID ).prepend( this.get( childID ) || childID );
+        return this;
+    },
+
+    /**
+        Remove an element by blueprint
+
+        @param {string} elemID The element to be removed.
+        You can remove multiple elements by adding arguments.
+
+        @returns Instance
+    */
+
+    remove : function( elemID ) {
+        this.$( Utils.array( arguments ).join(',') ).remove();
+        return this;
+    },
+
+    // a fast helper for building dom structures
+    // leave this out of the API for now
+
+    append : function( data ) {
+        var i, j;
+        for( i in data ) {
+            if ( data.hasOwnProperty( i ) ) {
+                if ( data[i].constructor === Array ) {
+                    for( j = 0; data[i][j]; j++ ) {
+                        this.appendChild( i, data[i][j] );
+                    }
+                } else {
+                    this.appendChild( i, data[i] );
+                }
+            }
+        }
+        return this;
+    },
+
+    // an internal helper for scaling according to options
+    _scaleImage : function( image, options ) {
+
+        image = image || this._controls.getActive();
+
+        // janpub (JH) fix:
+        // image might be unselected yet
+        // e.g. when external logics rescales the gallery on window resize events
+        if( !image ) {
+            return;
+        }
+
+        var self = this,
+
+            complete,
+
+            scaleLayer = function( img ) {
+                $( img.container ).children(':first').css({
+                    top: Math.max(0, Utils.parseValue( img.image.style.top )),
+                    left: Math.max(0, Utils.parseValue( img.image.style.left )),
+                    width: Utils.parseValue( img.image.width ),
+                    height: Utils.parseValue( img.image.height )
+                });
+            };
+
+        options = $.extend({
+            width:    this._stageWidth,
+            height:   this._stageHeight,
+            crop:     this._options.imageCrop,
+            max:      this._options.maxScaleRatio,
+            min:      this._options.minScaleRatio,
+            margin:   this._options.imageMargin,
+            position: this._options.imagePosition
+        }, options );
+
+        if ( this._options.layerFollow && this._options.imageCrop !== true ) {
+
+            if ( typeof options.complete == 'function' ) {
+                complete = options.complete;
+                options.complete = function() {
+                    complete.call( image, image );
+                    scaleLayer( image );
+                };
+            } else {
+                options.complete = scaleLayer;
+            }
+
+        } else {
+            $( image.container ).children(':first').css({ top: 0, left: 0 });
+        }
+
+        image.scale( options );
+        return this;
+    },
+
+    /**
+        Updates the carousel,
+        useful if you resize the gallery and want to re-check if the carousel nav is needed.
+
+        @returns Instance
+    */
+
+    updateCarousel : function() {
+        this._carousel.update();
+        return this;
+    },
+
+    /**
+        Rescales the gallery
+
+        @param {number} width The target width
+        @param {number} height The target height
+        @param {Function} complete The callback to be called when the scaling is complete
+
+        @returns Instance
+    */
+
+    rescale : function( width, height, complete ) {
+
+        var self = this;
+
+        // allow rescale(fn)
+        if ( typeof width === 'function' ) {
+            complete = width;
+            width = undef;
+        }
+
+        var scale = function() {
+
+            // set stagewidth
+            self._stageWidth = width || self.$( 'stage' ).width();
+            self._stageHeight = height || self.$( 'stage' ).height();
+
+            // scale the active image
+            self._scaleImage();
+
+            if ( self._options.carousel ) {
+                self.updateCarousel();
+            }
+
+            self.trigger( Galleria.RESCALE );
+
+            if ( typeof complete === 'function' ) {
+                complete.call( self );
+            }
+        };
+
+        if ( Galleria.WEBKIT && !width && !height ) {
+            Utils.addTimer( 'scale', scale, 10 );// webkit is too fast
+        } else {
+            scale.call( self );
+        }
+
+        return this;
+    },
+
+    /**
+        Refreshes the gallery.
+        Useful if you change image options at runtime and want to apply the changes to the active image.
+
+        @returns Instance
+    */
+
+    refreshImage : function() {
+        this._scaleImage();
+        if ( this._options.imagePan ) {
+            this.addPan();
+        }
+        return this;
+    },
+
+    /**
+        Shows an image by index
+
+        @param {number|boolean} index The index to show
+        @param {Boolean} rewind A boolean that should be true if you want the transition to go back
+
+        @returns Instance
+    */
+
+    show : function( index, rewind, _history ) {
+
+        // do nothing if index is false or queue is false and transition is in progress
+        if ( index === false || ( !this._options.queue && this._queue.stalled ) ) {
+            return;
+        }
+
+        index = Math.max( 0, Math.min( parseInt( index, 10 ), this.getDataLength() - 1 ) );
+
+        rewind = typeof rewind !== 'undefined' ? !!rewind : index < this.getIndex();
+
+        _history = _history || false;
+
+        // do the history thing and return
+        if ( !_history && Galleria.History ) {
+            Galleria.History.set( index.toString() );
+            return;
+        }
+
+        this._active = index;
+
+        Array.prototype.push.call( this._queue, {
+            index : index,
+            rewind : rewind
+        });
+        if ( !this._queue.stalled ) {
+            this._show();
+        }
+
+        return this;
+    },
+
+    // the internal _show method does the actual showing
+    _show : function() {
+
+        // shortcuts
+        var self = this,
+            queue = this._queue[ 0 ],
+            data = this.getData( queue.index );
+
+        if ( !data ) {
+            return;
+        }
+
+        var src = this.isFullscreen() && 'big' in data ? data.big : data.image, // use big image if fullscreen mode
+            active = this._controls.getActive(),
+            next = this._controls.getNext(),
+            cached = next.isCached( src ),
+            thumb = this._thumbnails[ queue.index ];
+
+        // to be fired when loading & transition is complete:
+        var complete = (function( data, next, active, queue, thumb ) {
+
+            return function() {
+
+                var win;
+
+                // remove stalled
+                self._queue.stalled = false;
+
+                // optimize quality
+                Utils.toggleQuality( next.image, self._options.imageQuality );
+
+                // remove old layer
+                self._layers[ self._controls.active ].innerHTML = '';
+
+                // swap
+                $( active.container ).css({
+                    zIndex: 0,
+                    opacity: 0
+                }).show();
+
+                $( next.container ).css({
+                    zIndex: 1
+                }).show();
+
+                self._controls.swap();
+
+                // add pan according to option
+                if ( self._options.imagePan ) {
+                    self.addPan( next.image );
+                }
+
+                // make the image link or add lightbox
+                // link takes precedence over lightbox if both are detected
+                if ( data.link || self._options.lightbox ) {
+
+                    $( next.image ).css({
+                        cursor: 'pointer'
+                    }).bind( 'mouseup', function() {
+
+                        // popup link
+                        if ( data.link ) {
+                            if ( self._options.popupLinks ) {
+                                win = window.open( data.link, '_blank' );
+                            } else {
+                                window.location.href = data.link;
+                            }
+                            return;
+                        }
+
+                        self.openLightbox();
+
+                    });
+                }
+
+                // remove the queued image
+                Array.prototype.shift.call( self._queue );
+
+                // if we still have images in the queue, show it
+                if ( self._queue.length ) {
+                    self._show();
+                }
+
+                // check if we are playing
+                self._playCheck();
+
+                // trigger IMAGE event
+                self.trigger({
+                    type: Galleria.IMAGE,
+                    index: queue.index,
+                    imageTarget: next.image,
+                    thumbTarget: thumb.image
+                });
+            };
+        }( data, next, active, queue, thumb ));
+
+        // let the carousel follow
+        if ( this._options.carousel && this._options.carouselFollow ) {
+            this._carousel.follow( queue.index );
+        }
+
+        // preload images
+        if ( this._options.preload ) {
+
+            var p, i,
+                n = this.getNext(),
+                ndata;
+
+            try {
+                for ( i = this._options.preload; i > 0; i-- ) {
+                    p = new Galleria.Picture();
+                    ndata = self.getData( n );
+                    p.preload( this.isFullscreen() && 'big' in ndata ? ndata.big : ndata.image );
+                    n = self.getNext( n );
+                }
+            } catch(e) {}
+        }
+
+        // show the next image, just in case
+        Utils.show( next.container );
+
+        // add active classes
+        $( self._thumbnails[ queue.index ].container )
+            .addClass( 'active' )
+            .siblings( '.active' )
+            .removeClass( 'active' );
+
+        // trigger the LOADSTART event
+        self.trigger( {
+            type: Galleria.LOADSTART,
+            cached: cached,
+            index: queue.index,
+            rewind: queue.rewind,
+            imageTarget: next.image,
+            thumbTarget: thumb.image
+        });
+
+        // begin loading the next image
+        next.load( src, function( next ) {
+
+            // add layer HTML
+            var layer = $( self._layers[ 1-self._controls.active ] ).html( data.layer || '' ).hide();
+
+            self._scaleImage( next, {
+
+                complete: function( next ) {
+
+                    // toggle low quality for IE
+                    if ( 'image' in active ) {
+                        Utils.toggleQuality( active.image, false );
+                    }
+                    Utils.toggleQuality( next.image, false );
+
+                    // stall the queue
+                    self._queue.stalled = true;
+
+                    // remove the image panning, if applied
+                    // TODO: rethink if this is necessary
+                    self.removePan();
+
+                    // set the captions and counter
+                    self.setInfo( queue.index );
+                    self.setCounter( queue.index );
+
+                    // show the layer now
+                    if ( data.layer ) {
+                        layer.show();
+                        // inherit click events set on image or stage
+                        if ( data.link || self._options.clicknext ) {
+                            layer.css( 'cursor', 'pointer' ).one( 'click', function() {
+                                if ( data.link ) {
+                                    $( next.image ).trigger( 'mouseup' );
+                                } else {
+                                    self.$( 'stage' ).trigger( 'click' );
+                                }
+                            });
+                        }
+                    }
+
+                    // trigger the LOADFINISH event
+                    self.trigger({
+                        type: Galleria.LOADFINISH,
+                        cached: cached,
+                        index: queue.index,
+                        rewind: queue.rewind,
+                        imageTarget: next.image,
+                        thumbTarget: self._thumbnails[ queue.index ].image
+                    });
+
+                    var transition = self._options.transition;
+
+                    // can JavaScript loop through objects in order? yes.
+                    $.each({
+                        initial: active.image === null,
+                        touch: Galleria.TOUCH,
+                        fullscreen: self.isFullscreen()
+                    }, function( type, arg ) {
+                        if ( arg && self._options[ type + 'Transition' ] !== undef ) {
+                            transition = self._options[ type + 'Transition' ];
+                            return false;
+                        }
+                    });
+
+                    // validate the transition
+                    if ( transition in _transitions === false ) {
+                        complete();
+                    } else {
+                        var params = {
+                            prev: active.container,
+                            next: next.container,
+                            rewind: queue.rewind,
+                            speed: self._options.transitionSpeed || 400
+                        };
+
+                        // call the transition function and send some stuff
+                        _transitions[ transition ].call(self, params, complete );
+
+                    }
+                }
+            });
+        });
+    },
+
+    /**
+        Gets the next index
+
+        @param {number} base Optional starting point
+
+        @returns {number} the next index, or the first if you are at the first (looping)
+    */
+
+    getNext : function( base ) {
+        base = typeof base === 'number' ? base : this.getIndex();
+        return base === this.getDataLength() - 1 ? 0 : base + 1;
+    },
+
+    /**
+        Gets the previous index
+
+        @param {number} base Optional starting point
+
+        @returns {number} the previous index, or the last if you are at the first (looping)
+    */
+
+    getPrev : function( base ) {
+        base = typeof base === 'number' ? base : this.getIndex();
+        return base === 0 ? this.getDataLength() - 1 : base - 1;
+    },
+
+    /**
+        Shows the next image in line
+
+        @returns Instance
+    */
+
+    next : function() {
+        if ( this.getDataLength() > 1 ) {
+            this.show( this.getNext(), false );
+        }
+        return this;
+    },
+
+    /**
+        Shows the previous image in line
+
+        @returns Instance
+    */
+
+    prev : function() {
+        if ( this.getDataLength() > 1 ) {
+            this.show( this.getPrev(), true );
+        }
+        return this;
+    },
+
+    /**
+        Retrieve a DOM element by element ID
+
+        @param {string} elemId The delement ID to fetch
+
+        @returns {HTMLElement} The elements DOM node or null if not found.
+    */
+
+    get : function( elemId ) {
+        return elemId in this._dom ? this._dom[ elemId ] : null;
+    },
+
+    /**
+        Retrieve a data object
+
+        @param {number} index The data index to retrieve.
+        If no index specified it will take the currently active image
+
+        @returns {Object} The data object
+    */
+
+    getData : function( index ) {
+        return index in this._data ?
+            this._data[ index ] : this._data[ this._active ];
+    },
+
+    /**
+        Retrieve the number of data items
+
+        @returns {number} The data length
+    */
+    getDataLength : function() {
+        return this._data.length;
+    },
+
+    /**
+        Retrieve the currently active index
+
+        @returns {number|boolean} The active index or false if none found
+    */
+
+    getIndex : function() {
+        return typeof this._active === 'number' ? this._active : false;
+    },
+
+    /**
+        Retrieve the stage height
+
+        @returns {number} The stage height
+    */
+
+    getStageHeight : function() {
+        return this._stageHeight;
+    },
+
+    /**
+        Retrieve the stage width
+
+        @returns {number} The stage width
+    */
+
+    getStageWidth : function() {
+        return this._stageWidth;
+    },
+
+    /**
+        Retrieve the option
+
+        @param {string} key The option key to retrieve. If no key specified it will return all options in an object.
+
+        @returns option or options
+    */
+
+    getOptions : function( key ) {
+        return typeof key === 'undefined' ? this._options : this._options[ key ];
+    },
+
+    /**
+        Set options to the instance.
+        You can set options using a key & value argument or a single object argument (see examples)
+
+        @param {string} key The option key
+        @param {string} value the the options value
+
+        @example setOptions( 'autoplay', true )
+        @example setOptions({ autoplay: true });
+
+        @returns Instance
+    */
+
+    setOptions : function( key, value ) {
+        if ( typeof key === 'object' ) {
+            $.extend( this._options, key );
+        } else {
+            this._options[ key ] = value;
+        }
+        return this;
+    },
+
+    /**
+        Starts playing the slideshow
+
+        @param {number} delay Sets the slideshow interval in milliseconds.
+        If you set it once, you can just call play() and get the same interval the next time.
+
+        @returns Instance
+    */
+
+    play : function( delay ) {
+
+        this._playing = true;
+
+        this._playtime = delay || this._playtime;
+
+        this._playCheck();
+
+        this.trigger( Galleria.PLAY );
+
+        return this;
+    },
+
+    /**
+        Stops the slideshow if currently playing
+
+        @returns Instance
+    */
+
+    pause : function() {
+
+        this._playing = false;
+
+        this.trigger( Galleria.PAUSE );
+
+        return this;
+    },
+
+    /**
+        Toggle between play and pause events.
+
+        @param {number} delay Sets the slideshow interval in milliseconds.
+
+        @returns Instance
+    */
+
+    playToggle : function( delay ) {
+        return ( this._playing ) ? this.pause() : this.play( delay );
+    },
+
+    /**
+        Checks if the gallery is currently playing
+
+        @returns {Boolean}
+    */
+
+    isPlaying : function() {
+        return this._playing;
+    },
+
+    /**
+        Checks if the gallery is currently in fullscreen mode
+
+        @returns {Boolean}
+    */
+
+    isFullscreen : function() {
+        return this._fullscreen.active;
+    },
+
+    _playCheck : function() {
+        var self = this,
+            played = 0,
+            interval = 20,
+            now = Utils.timestamp(),
+            timer_id = 'play' + this._id;
+
+        if ( this._playing ) {
+
+            Utils.clearTimer( timer_id );
+
+            var fn = function() {
+
+                played = Utils.timestamp() - now;
+                if ( played >= self._playtime && self._playing ) {
+                    Utils.clearTimer( timer_id );
+                    self.next();
+                    return;
+                }
+                if ( self._playing ) {
+
+                    // trigger the PROGRESS event
+                    self.trigger({
+                        type:         Galleria.PROGRESS,
+                        percent:      Math.ceil( played / self._playtime * 100 ),
+                        seconds:      Math.floor( played / 1000 ),
+                        milliseconds: played
+                    });
+
+                    Utils.addTimer( timer_id, fn, interval );
+                }
+            };
+            Utils.addTimer( timer_id, fn, interval );
+        }
+    },
+
+    /**
+        Modify the slideshow delay
+
+        @param {number} delay the number of milliseconds between slides,
+
+        @returns Instance
+    */
+
+    setPlaytime: function( delay ) {
+        this._playtime = delay;
+        return this;
+    },
+
+    setIndex: function( val ) {
+        this._active = val;
+        return this;
+    },
+
+    /**
+        Manually modify the counter
+
+        @param {number} index Optional data index to fectch,
+        if no index found it assumes the currently active index
+
+        @returns Instance
+    */
+
+    setCounter: function( index ) {
+
+        if ( typeof index === 'number' ) {
+            index++;
+        } else if ( typeof index === 'undefined' ) {
+            index = this.getIndex()+1;
+        }
+
+        this.get( 'current' ).innerHTML = index;
+
+        if ( IE ) { // weird IE bug
+
+            var count = this.$( 'counter' ),
+                opacity = count.css( 'opacity' );
+
+            if ( parseInt( opacity, 10 ) === 1) {
+                Utils.removeAlpha( count[0] );
+            } else {
+                this.$( 'counter' ).css( 'opacity', opacity );
+            }
+
+        }
+
+        return this;
+    },
+
+    /**
+        Manually set captions
+
+        @param {number} index Optional data index to fectch and apply as caption,
+        if no index found it assumes the currently active index
+
+        @returns Instance
+    */
+
+    setInfo : function( index ) {
+
+        var self = this,
+            data = this.getData( index );
+
+        $.each( ['title','description'], function( i, type ) {
+
+            var elem = self.$( 'info-' + type );
+
+            if ( !!data[type] ) {
+                elem[ data[ type ].length ? 'show' : 'hide' ]().html( data[ type ] );
+            } else {
+               elem.empty().hide();
+            }
+        });
+
+        return this;
+    },
+
+    /**
+        Checks if the data contains any captions
+
+        @param {number} index Optional data index to fectch,
+        if no index found it assumes the currently active index.
+
+        @returns {boolean}
+    */
+
+    hasInfo : function( index ) {
+
+        var check = 'title description'.split(' '),
+            i;
+
+        for ( i = 0; check[i]; i++ ) {
+            if ( !!this.getData( index )[ check[i] ] ) {
+                return true;
+            }
+        }
+        return false;
+
+    },
+
+    jQuery : function( str ) {
+
+        var self = this,
+            ret = [];
+
+        $.each( str.split(','), function( i, elemId ) {
+            elemId = $.trim( elemId );
+
+            if ( self.get( elemId ) ) {
+                ret.push( elemId );
+            }
+        });
+
+        var jQ = $( self.get( ret.shift() ) );
+
+        $.each( ret, function( i, elemId ) {
+            jQ = jQ.add( self.get( elemId ) );
+        });
+
+        return jQ;
+
+    },
+
+    /**
+        Converts element IDs into a jQuery collection
+        You can call for multiple IDs separated with commas.
+
+        @param {string} str One or more element IDs (comma-separated)
+
+        @returns jQuery
+
+        @example this.$('info,container').hide();
+    */
+
+    $ : function( str ) {
+        return this.jQuery.apply( this, Utils.array( arguments ) );
+    }
+
+};
+
+// End of Galleria prototype
+
+// Add events as static variables
+$.each( _events, function( i, ev ) {
+
+    // legacy events
+    var type = /_/.test( ev ) ? ev.replace( /_/g, '' ) : ev;
+
+    Galleria[ ev.toUpperCase() ] = 'galleria.'+type;
+
+} );
+
+$.extend( Galleria, {
+
+    // Browser helpers
+    IE9:     IE === 9,
+    IE8:     IE === 8,
+    IE7:     IE === 7,
+    IE6:     IE === 6,
+    IE:      IE,
+    WEBKIT:  /webkit/.test( NAV ),
+    SAFARI:  /safari/.test( NAV ),
+    CHROME:  /chrome/.test( NAV ),
+    QUIRK:   ( IE && doc.compatMode && doc.compatMode === "BackCompat" ),
+    MAC:     /mac/.test( navigator.platform.toLowerCase() ),
+    OPERA:   !!window.opera,
+    IPHONE:  /iphone/.test( NAV ),
+    IPAD:    /ipad/.test( NAV ),
+    ANDROID: /android/.test( NAV ),
+    TOUCH:   ('ontouchstart' in doc)
+
+});
+
+// Galleria static methods
+
+/**
+    Adds a theme that you can use for your Gallery
+
+    @param {Object} theme Object that should contain all your theme settings.
+    <ul>
+        <li>name - name of the theme</li>
+        <li>author - name of the author</li>
+        <li>css - css file name (not path)</li>
+        <li>defaults - default options to apply, including theme-specific options</li>
+        <li>init - the init function</li>
+    </ul>
+
+    @returns {Object} theme
+*/
+
+Galleria.addTheme = function( theme ) {
+
+    // make sure we have a name
+    if ( !theme.name ) {
+        Galleria.raise('No theme name specified');
+    }
+
+    if ( typeof theme.defaults !== 'object' ) {
+        theme.defaults = {};
+    } else {
+        theme.defaults = _legacyOptions( theme.defaults );
+    }
+
+    var css = false,
+        reg;
+
+    if ( typeof theme.css === 'string' ) {
+
+        // look for manually added CSS
+        $('link').each(function( i, link ) {
+            reg = new RegExp( theme.css );
+            if ( reg.test( link.href ) ) {
+
+                // we found the css
+                css = true;
+
+                // the themeload trigger
+                _themeLoad( theme );
+
+                return false;
+            }
+        });
+
+        // else look for the absolute path and load the CSS dynamic
+        if ( !css ) {
+
+            $('script').each(function( i, script ) {
+
+                // look for the theme script
+                reg = new RegExp( 'galleria\\.' + theme.name.toLowerCase() + '\\.' );
+                if( reg.test( script.src )) {
+
+                    // we have a match
+                    css = script.src.replace(/[^\/]*$/, '') + theme.css;
+
+                    Utils.addTimer( "css", function() {
+                        Utils.loadCSS( css, 'galleria-theme', function() {
+
+                            // the themeload trigger
+                            _themeLoad( theme );
+
+                        });
+                    }, 1);
+
+                }
+            });
+        }
+
+        if ( !css ) {
+            Galleria.raise('No theme CSS loaded');
+        }
+    } else {
+
+        // pass
+        _themeLoad( theme );
+    }
+    return theme;
+};
+
+/**
+    loadTheme loads a theme js file and attaches a load event to Galleria
+
+    @param {string} src The relative path to the theme source file
+
+    @param {Object} [options] Optional options you want to apply
+*/
+
+Galleria.loadTheme = function( src, options ) {
+
+    var loaded = false,
+        length = _galleries.length,
+        err = window.setTimeout( function() {
+            Galleria.raise( "Theme at " + src + " could not load, check theme path.", true );
+        }, 5000 );
+
+    // first clear the current theme, if exists
+    Galleria.theme = undef;
+
+    // load the theme
+    Utils.loadScript( src, function() {
+
+        window.clearTimeout( err );
+
+        // check for existing galleries and reload them with the new theme
+        if ( length ) {
+
+            // temporary save the new galleries
+            var refreshed = [];
+
+            // refresh all instances
+            // when adding a new theme to an existing gallery, all options will be resetted but the data will be kept
+            // you can apply new options as a second argument
+            $.each( Galleria.get(), function(i, instance) {
+
+                // mix the old data and options into the new instance
+                var op = $.extend( instance._original.options, {
+                    data_source: instance._data
+                }, options);
+
+                // remove the old container
+                instance.$('container').remove();
+
+                // create a new instance
+                var g = new Galleria();
+
+                // move the id
+                g._id = instance._id;
+
+                // initialize the new instance
+                g.init( instance._original.target, op );
+
+                // push the new instance
+                refreshed.push( g );
+            });
+
+            // now overwrite the old holder with the new instances
+            _galleries = refreshed;
+        }
+
+    });
+};
+
+/**
+    Retrieves a Galleria instance.
+
+    @param {number} [index] Optional index to retrieve.
+    If no index is supplied, the method will return all instances in an array.
+
+    @returns Instance or Array of instances
+*/
+
+Galleria.get = function( index ) {
+    if ( !!_instances[ index ] ) {
+        return _instances[ index ];
+    } else if ( typeof index !== 'number' ) {
+        return _instances;
+    } else {
+        Galleria.raise('Gallery index ' + index + ' not found');
+    }
+};
+
+/**
+    Creates a transition to be used in your gallery
+
+    @param {string} name The name of the transition that you will use as an option
+
+    @param {Function} fn The function to be executed in the transition.
+    The function contains two arguments, params and complete.
+    Use the params Object to integrate the transition, and then call complete when you are done.
+
+*/
+
+Galleria.addTransition = function( name, fn ) {
+    _transitions[name] = fn;
+};
+
+/**
+    The Galleria utilites
+*/
+
+Galleria.utils = Utils;
+
+/**
+    A helper metod for cross-browser logging.
+    It uses the console log if available otherwise it falls back to alert
+
+    @example Galleria.log("hello", document.body, [1,2,3]);
+*/
+
+Galleria.log = (function() {
+    if( 'console' in window && 'log' in window.console ) {
+        return window.console.log;
+    } else {
+        return function() {
+            window.alert( Utils.array( arguments ).join(', ') );
+        };
+    }
+}());
+
+/**
+    A ready method for adding callbacks when a gallery is ready
+    Each method is call before the extend option for every instance
+
+    @param {function} callback The function to call
+*/
+
+Galleria.ready = function( fn ) {
+    $.each( _galleries, function( i, gallery ) {
+        fn.call( gallery, gallery._options );
+    });
+    Galleria.ready.callbacks.push( fn );
+};
+
+Galleria.ready.callbacks = [];
+
+/**
+    Method for raising errors
+
+    @param {string} msg The message to throw
+
+    @param {boolean} [fatal] Set this to true to override debug settings and display a fatal error
+*/
+
+Galleria.raise = function( msg, fatal ) {
+
+    var type = fatal ? 'Fatal error' : 'Error',
+
+        self = this,
+
+        echo = function( msg ) {
+
+            var html = '<div style="padding:4px;margin:0 0 2px;background:#' +
+                ( fatal ? '811' : '222' ) + '";>' +
+                ( fatal ? '<strong>' + type + ': </strong>' : '' ) +
+                msg + '</div>';
+
+            $.each( _instances, function() {
+
+                var cont = this.$( 'errors' ),
+                    target = this.$( 'target' );
+
+                if ( !cont.length ) {
+
+                    target.css( 'position', 'relative' );
+
+                    cont = this.addElement( 'errors' ).appendChild( 'target', 'errors' ).$( 'errors' ).css({
+                        color: '#fff',
+                        position: 'absolute',
+                        top: 0,
+                        left: 0,
+                        zIndex: 100000
+                    });
+                }
+
+                cont.append( html );
+
+            });
+        };
+
+    // if debug is on, display errors and throw exception if fatal
+    if ( DEBUG ) {
+        echo( msg );
+        if ( fatal ) {
+            throw new Error(type + ': ' + msg);
+        }
+
+    // else just echo a silent generic error if fatal
+    } else if ( fatal ) {
+        if ( _hasError ) {
+            return;
+        }
+        _hasError = true;
+        fatal = false;
+        echo( 'Image gallery could not load.' );
+    }
+};
+
+// Add the version
+Galleria.version = VERSION;
+
+/**
+    A method for checking what version of Galleria the user has installed and throws a readable error if the user needs to upgrade.
+    Useful when building plugins that requires a certain version to function.
+
+    @param {number} version The minimum version required
+
+    @param {string} [msg] Optional message to display. If not specified, Galleria will throw a generic error.
+*/
+
+Galleria.requires = function( version, msg ) {
+    msg = msg || 'You need to upgrade Galleria to version ' + version + ' to use one or more components.';
+    if ( Galleria.version < version ) {
+        Galleria.raise(msg, true);
+    }
+};
+
+/**
+    Adds preload, cache, scale and crop functionality
+
+    @constructor
+
+    @requires jQuery
+
+    @param {number} [id] Optional id to keep track of instances
+*/
+
+Galleria.Picture = function( id ) {
+
+    // save the id
+    this.id = id || null;
+
+    // the image should be null until loaded
+    this.image = null;
+
+    // Create a new container
+    this.container = Utils.create('galleria-image');
+
+    // add container styles
+    $( this.container ).css({
+        overflow: 'hidden',
+        position: 'relative' // for IE Standards mode
+    });
+
+    // saves the original measurements
+    this.original = {
+        width: 0,
+        height: 0
+    };
+
+    // flag when the image is ready
+    this.ready = false;
+
+    // placeholder for the timeout
+    this.tid = null;
+
+};
+
+Galleria.Picture.prototype = {
+
+    // the inherited cache object
+    cache: {},
+
+    // show the image on stage
+    show: function() {
+        Utils.show( this.image );
+    },
+
+    // hide the image
+    hide: function() {
+        Utils.moveOut( this.image );
+    },
+
+    clear: function() {
+        this.image = null;
+    },
+
+    /**
+        Checks if an image is in cache
+
+        @param {string} src The image source path, ex '/path/to/img.jpg'
+
+        @returns {boolean}
+    */
+
+    isCached: function( src ) {
+        return !!this.cache[src];
+    },
+
+    /**
+        Preloads an image into the cache
+
+        @param {string} src The image source path, ex '/path/to/img.jpg'
+
+        @returns Galleria.Picture
+    */
+
+    preload: function( src ) {
+        $( new Image() ).load((function(src, cache) {
+            return function() {
+                cache[ src ] = src;
+            };
+        }( src, this.cache ))).attr( 'src', src );
+    },
+
+    /**
+        Loads an image and call the callback when ready.
+        Will also add the image to cache.
+
+        @param {string} src The image source path, ex '/path/to/img.jpg'
+        @param {Function} callback The function to be executed when the image is loaded & scaled
+
+        @returns The image container (jQuery object)
+    */
+
+    load: function(src, callback) {
+
+        // set a load timeout for debugging
+        this.tid = window.setTimeout( (function(src) {
+            return function() {
+                Galleria.raise('Image not loaded in ' + Math.round( TIMEOUT/1000 ) + ' seconds: '+ src);
+            };
+        }( src )), TIMEOUT );
+
+        this.image = new Image();
+
+        var i = 0,
+            reload = false,
+
+            // some jquery cache
+            $container = $( this.container ),
+            $image = $( this.image ),
+
+            // the onload method
+            onload = (function( self, callback, src ) {
+
+                return function() {
+
+                    var complete = function() {
+
+                        $( this ).unbind( 'load' );
+
+                        // save the original size
+                        self.original = {
+                            height: this.height,
+                            width: this.width
+                        };
+
+                        self.cache[ src ] = src; // will override old cache
+
+                        // clear the debug timeout
+                        window.clearTimeout( self.tid );
+
+                        if (typeof callback == 'function' ) {
+                            window.setTimeout(function() {
+                                callback.call( self, self );
+                            },1);
+                        }
+                    };
+
+                    // Delay the callback to "fix" the Adblock Bug
+                    // http://code.google.com/p/adblockforchrome/issues/detail?id=3701
+                    if ( ( !this.width || !this.height ) ) {
+                        window.setTimeout( (function( img ) {
+                            return function() {
+                                if ( img.width && img.height ) {
+                                    complete.call( img );
+                                } else {
+                                    Galleria.raise('Could not extract width/height from image: ' + img.src +
+                                        '. Traced measures: width:' + img.width + 'px, height: ' + img.height + 'px.');
+                                }
+                            };
+                        }( this )), 2);
+                    } else {
+                        complete.call( this );
+                    }
+                };
+            }( this, callback, src ));
+
+        // remove any previous images
+        $container.find( 'img' ).remove();
+
+        // append the image
+        $image.css( 'display', 'block').appendTo( this.container );
+
+        // hide it for now
+        Utils.hide( this.image );
+
+        if ( this.cache[ src ] ) {
+
+            // quick load on cache
+            $( this.image ).load( onload ).attr( 'src', src );
+
+            return this.container;
+        }
+
+        // begin load and insert in cache when done
+        $( this.image ).load( onload ).error( function() {
+            if ( !reload ) {
+                reload = true;
+                // reload the image with a timestamp
+                window.setTimeout((function(image, src) {
+                    return function() {
+                        image.attr('src', src + '?' + Utils.timestamp() );
+                    };
+                }( $(this), src )), 50);
+            } else {
+                // apply the dummy image if it exists
+                if ( DUMMY ) {
+                    $( this ).attr( 'src', DUMMY );
+                } else {
+                    Galleria.raise('Image not found: ' + src);
+                }
+            }
+        }).attr( 'src', src );
+
+        // return the container
+        return this.container;
+    },
+
+    /**
+        Scales and crops the image
+
+        @param {Object} options The method takes an object with a number of options:
+
+        <ul>
+            <li>width - width of the container</li>
+            <li>height - height of the container</li>
+            <li>min - minimum scale ratio</li>
+            <li>max - maximum scale ratio</li>
+            <li>margin - distance in pixels from the image border to the container</li>
+            <li>complete - a callback that fires when scaling is complete</li>
+            <li>position - positions the image, works like the css background-image property.</li>
+            <li>crop - defines how to crop. Can be true, false, 'width' or 'height'</li>
+            <li>canvas - set to true to try a canvas-based rescale</li>
+        </ul>
+
+        @returns The image container object (jQuery)
+    */
+
+    scale: function( options ) {
+
+        // extend some defaults
+        options = $.extend({
+            width: 0,
+            height: 0,
+            min: undef,
+            max: undef,
+            margin: 0,
+            complete: function() {},
+            position: 'center',
+            crop: false,
+            canvas: false
+        }, options);
+
+        // return the element if no image found
+        if (!this.image) {
+            return this.container;
+        }
+
+        // store locale variables
+        var width,
+            height,
+            self = this,
+            $container = $( self.container ),
+            data;
+
+        // wait for the width/height
+        Utils.wait({
+            until: function() {
+                width  = options.width ||
+                         $container.width() ||
+                         Utils.parseValue( $container.css('width') );
+
+                height = options.height ||
+                         $container.height() ||
+                         Utils.parseValue( $container.css('height') );
+
+                return width && height;
+            },
+            success: function() {
+                // calculate some cropping
+                var newWidth = ( width - options.margin * 2 ) / self.original.width,
+                    newHeight = ( height - options.margin * 2 ) / self.original.height,
+                    cropMap = {
+                        'true'  : Math.max( newWidth, newHeight ),
+                        'width' : newWidth,
+                        'height': newHeight,
+                        'false' : Math.min( newWidth, newHeight )
+                    },
+                    ratio = cropMap[ options.crop.toString() ],
+                    canvasKey = '';
+
+                // allow max_scale_ratio
+                if ( options.max ) {
+                    ratio = Math.min( options.max, ratio );
+                }
+
+                // allow min_scale_ratio
+                if ( options.min ) {
+                    ratio = Math.max( options.min, ratio );
+                }
+
+                $.each( ['width','height'], function( i, m ) {
+                    $( self.image )[ m ]( self[ m ] = self.image[ m ] = Math.round( self.original[ m ] * ratio ) );
+                });
+
+                $( self.container ).width( width ).height( height );
+
+                if ( options.canvas && _canvas ) {
+
+                    _canvas.elem.width = self.width;
+                    _canvas.elem.height = self.height;
+
+                    canvasKey = self.image.src + ':' + self.width + 'x' + self.height;
+
+                    self.image.src = _canvas.cache[ canvasKey ] || (function( key ) {
+
+                        _canvas.context.drawImage(self.image, 0, 0, self.original.width*ratio, self.original.height*ratio);
+
+                        try {
+
+                            data = _canvas.elem.toDataURL();
+                            _canvas.length += data.length;
+                            _canvas.cache[ key ] = data;
+                            return data;
+
+                        } catch( e ) {
+                            return self.image.src;
+                        }
+
+                    }( canvasKey ) );
+
+                }
+
+                // calculate image_position
+                var pos = {},
+                    mix = {},
+                    getPosition = function(value, measure, margin) {
+                        var result = 0;
+                        if (/\%/.test(value)) {
+                            var flt = parseInt( value, 10 ) / 100,
+                                m = self.image[ measure ] || $( self.image )[ measure ]();
+
+                            result = Math.ceil( m * -1 * flt + margin * flt );
+                        } else {
+                            result = Utils.parseValue( value );
+                        }
+                        return result;
+                    },
+                    positionMap = {
+                        'top': { top: 0 },
+                        'left': { left: 0 },
+                        'right': { left: '100%' },
+                        'bottom': { top: '100%' }
+                    };
+
+                $.each( options.position.toLowerCase().split(' '), function( i, value ) {
+                    if ( value === 'center' ) {
+                        value = '50%';
+                    }
+                    pos[i ? 'top' : 'left'] = value;
+                });
+
+                $.each( pos, function( i, value ) {
+                    if ( positionMap.hasOwnProperty( value ) ) {
+                        $.extend( mix, positionMap[ value ] );
+                    }
+                });
+
+                pos = pos.top ? $.extend( pos, mix ) : mix;
+
+                pos = $.extend({
+                    top: '50%',
+                    left: '50%'
+                }, pos);
+
+                // apply position
+                $( self.image ).css({
+                    position : 'absolute',
+                    top :  getPosition(pos.top, 'height', height),
+                    left : getPosition(pos.left, 'width', width)
+                });
+
+                // show the image
+                self.show();
+
+                // flag ready and call the callback
+                self.ready = true;
+                options.complete.call( self, self );
+
+            },
+            error: function() {
+                Galleria.raise('Could not scale image: '+self.image.src);
+            },
+            timeout: 1000
+        });
+        return this;
+    }
+};
+
+// our own easings
+$.extend( $.easing, {
+
+    galleria: function (_, t, b, c, d) {
+        if ((t/=d/2) < 1) {
+            return c/2*t*t*t + b;
+        }
+        return c/2*((t-=2)*t*t + 2) + b;
+    },
+
+    galleriaIn: function (_, t, b, c, d) {
+        return c*(t/=d)*t + b;
+    },
+
+    galleriaOut: function (_, t, b, c, d) {
+        return -c *(t/=d)*(t-2) + b;
+    }
+
+});
+
+// the plugin initializer
+$.fn.galleria = function( options ) {
+
+    return this.each(function() {
+        $( this ).data( 'galleria', new Galleria().init( this, options ) );
+    });
+
+};
+
+// phew
+
+}( jQuery ) );
Index: /extensions/stripped_galleria/galleria/galleria-1.2.6.min.js
===================================================================
--- /extensions/stripped_galleria/galleria/galleria-1.2.6.min.js	(revision 12977)
+++ /extensions/stripped_galleria/galleria/galleria-1.2.6.min.js	(revision 12977)
@@ -0,0 +1,102 @@
+/*
+ Galleria v 1.2.6 2011-12-12
+ http://galleria.aino.se
+
+ Copyright (c) 2011, Aino
+ Licensed under the MIT license.
+*/
+(function(e){var k=this,m=k.document,G=e(m),u=e(k),H=!0,A=3E4,B=!1,x=navigator.userAgent.toLowerCase(),I=k.location.hash.replace(/#\//,""),q=function(){var a=3,b=m.createElement("div"),d=b.getElementsByTagName("i");do b.innerHTML="<\!--[if gt IE "+ ++a+"]><i></i><![endif]--\>";while(d[0]);return a>4?a:void 0}(),v=function(){return{html:m.documentElement,body:m.body,head:m.getElementsByTagName("head")[0],title:m.title}},J=function(){var a=[];e.each("data ready thumbnail loadstart loadfinish image play pause progress fullscreen_enter fullscreen_exit idle_enter idle_exit rescale lightbox_open lightbox_close lightbox_image".split(" "),
+function(b,d){a.push(d);/_/.test(d)&&a.push(d.replace(/_/g,""))});return a}(),K=function(a){var b;if(typeof a!=="object")return a;e.each(a,function(d,c){/^[a-z]+_/.test(d)&&(b="",e.each(d.split("_"),function(a,c){b+=a>0?c.substr(0,1).toUpperCase()+c.substr(1):c}),a[b]=c,delete a[d])});return a},C=function(a){return e.inArray(a,J)>-1?Galleria[a.toUpperCase()]:a},w={trunk:{},add:function(a,b,d,c){c=c||!1;this.clear(a);if(c)var e=b,b=function(){e();w.add(a,b,d)};this.trunk[a]=k.setTimeout(b,d)},clear:function(a){var b=
+function(a){k.clearTimeout(this.trunk[a]);delete this.trunk[a]},d;if(a&&a in this.trunk)b.call(w,a);else if(typeof a==="undefined")for(d in this.trunk)this.trunk.hasOwnProperty(d)&&b.call(w,d)}},z=[],y=[],L=!1,t=!1,M=[],D=function(a){Galleria.theme=a;e.each(M,function(a,d){d._initialized||d._init.call(d)})},f=function(){return{array:function(a){return Array.prototype.slice.call(a,0)},create:function(a,b){var d=m.createElement(b||"div");d.className=a;return d},getScriptPath:function(a){a=a||e("script:last").attr("src");
+a=a.split("/");if(a.length==1)return"";a.pop();return a.join("/")+"/"},animate:function(){var a=function(a){var b="transition WebkitTransition MozTransition OTransition".split(" "),c;if(k.opera)return!1;for(c=0;b[c];c++)if(typeof a[b[c]]!=="undefined")return b[c];return!1}((m.body||m.documentElement).style),b={MozTransition:"transitionend",OTransition:"oTransitionEnd",WebkitTransition:"webkitTransitionEnd",transition:"transitionend"}[a],d={_default:[0.25,0.1,0.25,1],galleria:[0.645,0.045,0.355,1],
+galleriaIn:[0.55,0.085,0.68,0.53],galleriaOut:[0.25,0.46,0.45,0.94],ease:[0.25,0,0.25,1],linear:[0.25,0.25,0.75,0.75],"ease-in":[0.42,0,1,1],"ease-out":[0,0,0.58,1],"ease-in-out":[0.42,0,0.58,1]},c=function(a,b,c){var d={},c=c||"transition";e.each("webkit moz ms o".split(" "),function(){d["-"+this+"-"+c]=b});a.css(d)},h=function(a){c(a,"none","transition");Galleria.WEBKIT&&Galleria.TOUCH&&(c(a,"translate3d(0,0,0)","transform"),a.data("revert")&&(a.css(a.data("revert")),a.data("revert",null)))},j,
+i,g,l,p,n,E;return function(o,s,r){r=e.extend({duration:400,complete:function(){},stop:!1},r);o=e(o);r.duration?a?(r.stop&&(o.unbind(b),h(o)),j=!1,e.each(s,function(a,b){E=o.css(a);f.parseValue(E)!=f.parseValue(b)&&(j=!0);o.css(a,E)}),j?(i=[],g=r.easing in d?d[r.easing]:d._default,l=" "+r.duration+"ms cubic-bezier("+g.join(",")+")",k.setTimeout(function(){o.one(b,function(a){return function(){h(a);r.complete.call(a[0])}}(o));if(Galleria.WEBKIT&&Galleria.TOUCH&&(p={},n=[0,0,0],e.each(["left","top"],
+function(a,b){b in s&&(n[a]=f.parseValue(s[b])-f.parseValue(o.css(b))+"px",p[b]=s[b],delete s[b])}),n[0]||n[1]))o.data("revert",p),i.push("-webkit-transform"+l),c(o,"translate3d("+n.join(",")+")","transform");e.each(s,function(a){i.push(a+l)});c(o,i.join(","));o.css(s)},1)):k.setTimeout(function(){r.complete.call(o[0])},r.duration)):o.animate(s,r):(o.css(s),r.complete.call(o[0]))}}(),removeAlpha:function(a){if(q<9&&a){var b=a.style,a=(a=a.currentStyle)&&a.filter||b.filter||"";if(/alpha/.test(a))b.filter=
+a.replace(/alpha\([^)]*\)/i,"")}},forceStyles:function(a,b){a=e(a);a.attr("style")&&a.data("styles",a.attr("style")).removeAttr("style");a.css(b)},revertStyles:function(){e.each(f.array(arguments),function(a,b){b=e(b);b.removeAttr("style");b.attr("style","");b.data("styles")&&b.attr("style",b.data("styles")).data("styles",null)})},moveOut:function(a){f.forceStyles(a,{position:"absolute",left:-1E4})},moveIn:function(){f.revertStyles.apply(f,f.array(arguments))},elem:function(a){return a instanceof
+e?{$:a,dom:a[0]}:{$:e(a),dom:a}},hide:function(a,b,d){var d=d||function(){},c=f.elem(a),e=c.$,a=c.dom;e.data("opacity")||e.data("opacity",e.css("opacity"));c={opacity:0};b?f.animate(a,c,{duration:b,complete:q<9&&a?function(){f.removeAlpha(a);a.style.visibility="hidden";d.call(a)}:d,stop:!0}):q<9&&a?(f.removeAlpha(a),a.style.visibility="hidden"):e.css(c)},show:function(a,b,d){var d=d||function(){},c=f.elem(a),e=c.$,a=c.dom,j={opacity:parseFloat(e.data("opacity"))||1};if(b){if(q<9)e.css("opacity",0),
+a.style.visibility="visible";f.animate(a,j,{duration:b,complete:q<9&&a?function(){j.opacity==1&&f.removeAlpha(a);d.call(a)}:d,stop:!0})}else q<9&&j.opacity==1&&a?(f.removeAlpha(a),a.style.visibility="visible"):e.css(j)},optimizeTouch:function(){var a,b,d,c,f={},j=function(a){a.preventDefault();f=e.extend({},a,!0)},i=function(){this.evt=f},g=function(){this.handler.call(a,this.evt)};return function(l){e(l).bind("touchend",function(l){a=l.target;for(c=!0;a.parentNode&&a!=l.currentTarget&&c;)b=e(a).data("events"),
+d=e(a).data("fakes"),b&&"click"in b?(c=!1,l.preventDefault(),e(a).click(j).click(),b.click.pop(),e.each(b.click,i),e(a).data("fakes",b.click),delete b.click):d&&(c=!1,l.preventDefault(),e.each(d,g)),a=a.parentNode})}}(),addTimer:function(){w.add.apply(w,f.array(arguments));return this},clearTimer:function(){w.clear.apply(w,f.array(arguments));return this},wait:function(a){var a=e.extend({until:function(){return!1},success:function(){},error:function(){Galleria.raise("Could not complete wait function.")},
+timeout:3E3},a),b=f.timestamp(),d,c,h=function(){c=f.timestamp();d=c-b;if(a.until(d))return a.success(),!1;if(c>=b+a.timeout)return a.error(),!1;k.setTimeout(h,10)};k.setTimeout(h,10)},toggleQuality:function(a,b){if(!(q!==7&&q!==8)&&a)typeof b==="undefined"&&(b=a.style.msInterpolationMode==="nearest-neighbor"),a.style.msInterpolationMode=b?"bicubic":"nearest-neighbor"},insertStyleTag:function(a){var b=m.createElement("style");v().head.appendChild(b);b.styleSheet?b.styleSheet.cssText=a:(a=m.createTextNode(a),
+b.appendChild(a))},loadScript:function(a,b){var d=!1,c=e("<script>").attr({src:a,async:!0}).get(0);c.onload=c.onreadystatechange=function(){if(!d&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete"))d=!0,c.onload=c.onreadystatechange=null,typeof b==="function"&&b.call(this,this)};v().head.appendChild(c)},parseValue:function(a){return typeof a==="number"?a:typeof a==="string"?(a=a.match(/\-?\d|\./g))&&a.constructor===Array?a.join("")*1:0:0},timestamp:function(){return(new Date).getTime()},
+loadCSS:function(a,b,d){var c,h=!1,j;e("link[rel=stylesheet]").each(function(){if(RegExp(a).test(this.href))return c=this,!1});typeof b==="function"&&(d=b,b=void 0);d=d||function(){};if(c)return d.call(c,c),c;j=m.styleSheets.length;e("#"+b).length?(e("#"+b).attr("href",a),j--,h=!0):(c=e("<link>").attr({rel:"stylesheet",href:a,id:b}).get(0),k.setTimeout(function(){var b=e('link[rel="stylesheet"], style');b.length?b.get(0).parentNode.insertBefore(c,b[0]):v().head.appendChild(c);q?j>=31?Galleria.raise("You have reached the browser stylesheet limit (31)",
+!0):c.onreadystatechange=function(){if(!h&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete"))h=!0}:/file:\/\//i.test(a)?h=!0:e.ajax({url:a,success:function(){h=!0},error:function(a){a.isRejected()&&Galleria.WEBKIT&&(h=!0)}})},10));typeof d==="function"&&f.wait({until:function(){return h&&m.styleSheets.length>j},success:function(){k.setTimeout(function(){d.call(c,c)},100)},error:function(){Galleria.raise("Theme CSS could not load",!0)},timeout:1E4});return c}}}(),F=function(){var a=
+function(a,d,c,h){var j=this.getOptions("easing"),i=this.getStageWidth(),g={left:i*(a.rewind?-1:1)},l={left:0};c?(g.opacity=0,l.opacity=1):g.opacity=1;e(a.next).css(g);f.animate(a.next,l,{duration:a.speed,complete:function(a){return function(){d();a.css({left:0})}}(e(a.next).add(a.prev)),queue:!1,easing:j});if(h)a.rewind=!a.rewind;if(a.prev){g={left:0};l={left:i*(a.rewind?1:-1)};if(c)g.opacity=1,l.opacity=0;e(a.prev).css(g);f.animate(a.prev,l,{duration:a.speed,queue:!1,easing:j,complete:function(){e(this).css("opacity",
+0)}})}};return{fade:function(a,d){e(a.next).css({opacity:0,left:0}).show();f.animate(a.next,{opacity:1},{duration:a.speed,complete:d});a.prev&&(e(a.prev).css("opacity",1).show(),f.animate(a.prev,{opacity:0},{duration:a.speed}))},flash:function(a,d){e(a.next).css({opacity:0,left:0});a.prev?f.animate(a.prev,{opacity:0},{duration:a.speed/2,complete:function(){f.animate(a.next,{opacity:1},{duration:a.speed,complete:d})}}):f.animate(a.next,{opacity:1},{duration:a.speed,complete:d})},pulse:function(a,d){a.prev&&
+e(a.prev).hide();e(a.next).css({opacity:0,left:0}).show();f.animate(a.next,{opacity:1},{duration:a.speed,complete:d})},slide:function(b,d){a.apply(this,f.array(arguments))},fadeslide:function(b,d){a.apply(this,f.array(arguments).concat([!0]))},doorslide:function(b,d){a.apply(this,f.array(arguments).concat([!1,!0]))}}}();Galleria=function(){var a=this;this._theme=void 0;this._options={};this._playing=!1;this._playtime=5E3;this._active=null;this._queue={length:0};this._data=[];this._dom={};this._thumbnails=
+[];this._layers=[];this._firstrun=this._initialized=!1;this._stageHeight=this._stageWidth=0;this._target=void 0;this._id=Math.random();e.each("container stage images image-nav image-nav-left image-nav-right info info-text info-title info-description thumbnails thumbnails-list thumbnails-container thumb-nav-left thumb-nav-right loader counter tooltip".split(" "),function(b,c){a._dom[c]=f.create("galleria-"+c)});e.each("current total".split(" "),function(b,c){a._dom[c]=f.create("galleria-"+c,"span")});
+var b=this._keyboard={keys:{UP:38,DOWN:40,LEFT:37,RIGHT:39,RETURN:13,ESCAPE:27,BACKSPACE:8,SPACE:32},map:{},bound:!1,press:function(c){var d=c.keyCode||c.which;d in b.map&&typeof b.map[d]==="function"&&b.map[d].call(a,c)},attach:function(a){var c,d;for(c in a)a.hasOwnProperty(c)&&(d=c.toUpperCase(),d in b.keys?b.map[b.keys[d]]=a[c]:b.map[d]=a[c]);if(!b.bound)b.bound=!0,G.bind("keydown",b.press)},detach:function(){b.bound=!1;b.map={};G.unbind("keydown",b.press)}},d=this._controls={0:void 0,1:void 0,
+active:0,swap:function(){d.active=d.active?0:1},getActive:function(){return d[d.active]},getNext:function(){return d[1-d.active]}},c=this._carousel={next:a.$("thumb-nav-right"),prev:a.$("thumb-nav-left"),width:0,current:0,max:0,hooks:[],update:function(){var b=0,d=0,f=[0];e.each(a._thumbnails,function(a,c){c.ready&&(b+=c.outerWidth||e(c.container).outerWidth(!0),f[a+1]=b,d=Math.max(d,c.outerHeight||e(c.container).outerHeight(!0)))});a.$("thumbnails").css({width:b,height:d});c.max=b;c.hooks=f;c.width=
+a.$("thumbnails-list").width();c.setClasses();a.$("thumbnails-container").toggleClass("galleria-carousel",b>c.width);c.width=a.$("thumbnails-list").width()},bindControls:function(){var b;c.next.bind("click",function(d){d.preventDefault();if(a._options.carouselSteps==="auto")for(b=c.current;b<c.hooks.length;b++){if(c.hooks[b]-c.hooks[c.current]>c.width){c.set(b-2);break}}else c.set(c.current+a._options.carouselSteps)});c.prev.bind("click",function(d){d.preventDefault();if(a._options.carouselSteps===
+"auto")for(b=c.current;b>=0;b--)if(c.hooks[c.current]-c.hooks[b]>c.width){c.set(b+2);break}else{if(b===0){c.set(0);break}}else c.set(c.current-a._options.carouselSteps)})},set:function(a){for(a=Math.max(a,0);c.hooks[a-1]+c.width>=c.max&&a>=0;)a--;c.current=a;c.animate()},getLast:function(a){return(a||c.current)-1},follow:function(a){if(a===0||a===c.hooks.length-2)c.set(a);else{for(var b=c.current;c.hooks[b]-c.hooks[c.current]<c.width&&b<=c.hooks.length;)b++;a-1<c.current?c.set(a-1):a+2>b&&c.set(a-
+b+c.current+2)}},setClasses:function(){c.prev.toggleClass("disabled",!c.current);c.next.toggleClass("disabled",c.hooks[c.current]+c.width>=c.max)},animate:function(){c.setClasses();var b=c.hooks[c.current]*-1;isNaN(b)||f.animate(a.get("thumbnails"),{left:b},{duration:a._options.carouselSpeed,easing:a._options.easing,queue:!1})}},h=this._tooltip={initialized:!1,open:!1,init:function(){h.initialized=!0;f.insertStyleTag(".galleria-tooltip{padding:3px 8px;max-width:50%;background:#ffe;color:#000;z-index:3;position:absolute;font-size:11px;line-height:1.3opacity:0;box-shadow:0 0 2px rgba(0,0,0,.4);-moz-box-shadow:0 0 2px rgba(0,0,0,.4);-webkit-box-shadow:0 0 2px rgba(0,0,0,.4);}");
+a.$("tooltip").css("opacity",0.8);f.hide(a.get("tooltip"))},move:function(b){var c=a.getMousePosition(b).x,b=a.getMousePosition(b).y,d=a.$("tooltip"),e=b,f=d.outerHeight(!0)+1,h=d.outerWidth(!0),j=f+15,h=a.$("container").width()-h-2,f=a.$("container").height()-f-2;!isNaN(c)&&!isNaN(e)&&(c+=10,e-=30,c=Math.max(0,Math.min(h,c)),e=Math.max(0,Math.min(f,e)),b<j&&(e=j),d.css({left:c,top:e}))},bind:function(b,c){if(!Galleria.TOUCH){h.initialized||h.init();var d=function(b,c){h.define(b,c);e(b).hover(function(){f.clearTimer("switch_tooltip");
+a.$("container").unbind("mousemove",h.move).bind("mousemove",h.move).trigger("mousemove");h.show(b);Galleria.utils.addTimer("tooltip",function(){a.$("tooltip").stop().show().animate({opacity:1});h.open=!0},h.open?0:500)},function(){a.$("container").unbind("mousemove",h.move);f.clearTimer("tooltip");a.$("tooltip").stop().animate({opacity:0},200,function(){a.$("tooltip").hide();f.addTimer("switch_tooltip",function(){h.open=!1},1E3)})})};typeof c==="string"?d(b in a._dom?a.get(b):b,c):e.each(b,function(b,
+c){d(a.get(b),c)})}},show:function(b){var b=e(b in a._dom?a.get(b):b),c=b.data("tt"),d=function(a){k.setTimeout(function(a){return function(){h.move(a)}}(a),10);b.unbind("mouseup",d)};if(c=typeof c==="function"?c():c)a.$("tooltip").html(c.replace(/\s/,"&nbsp;")),b.bind("mouseup",d)},define:function(b,c){if(typeof c!=="function")var d=c,c=function(){return d};b=e(b in a._dom?a.get(b):b).data("tt",c);h.show(b)}},j=this._fullscreen={scrolled:0,crop:void 0,transition:void 0,active:!1,keymap:a._keyboard.map,
+enter:function(b){j.active=!0;f.hide(a.getActiveImage());a.$("container").addClass("fullscreen");j.scrolled=u.scrollTop();f.forceStyles(a.get("container"),{position:"fixed",top:0,left:0,width:"100%",height:"100%",zIndex:1E4});var c={height:"100%",overflow:"hidden",margin:0,padding:0},d=a.getData(),h=a._options;f.forceStyles(v().html,c);f.forceStyles(v().body,c);j.keymap=e.extend({},a._keyboard.map);a.attachKeyboard({escape:a.exitFullscreen,right:a.next,left:a.prev});j.crop=h.imageCrop;if(h.fullscreenCrop!=
+void 0)h.imageCrop=h.fullscreenCrop;if(d&&d.big&&d.image!==d.big){var c=new Galleria.Picture,i=c.isCached(d.big),g=a.getIndex(),r=a._thumbnails[g];a.trigger({type:Galleria.LOADSTART,cached:i,rewind:!1,index:g,imageTarget:a.getActiveImage(),thumbTarget:r});c.load(d.big,function(b){a._scaleImage(b,{complete:function(b){a.trigger({type:Galleria.LOADFINISH,cached:i,index:g,rewind:!1,imageTarget:b.image,thumbTarget:r});var c=a._controls.getActive().image;c&&e(c).width(b.image.width).height(b.image.height).attr("style",
+e(b.image).attr("style")).attr("src",b.image.src)}})})}a.rescale(function(){f.addTimer("fullscreen_enter",function(){f.show(a.getActiveImage());typeof b==="function"&&b.call(a)},100);a.trigger(Galleria.FULLSCREEN_ENTER)});u.resize(function(){j.scale()})},scale:function(){a.rescale()},exit:function(b){j.active=!1;f.hide(a.getActiveImage());a.$("container").removeClass("fullscreen");f.revertStyles(a.get("container"),v().html,v().body);k.scrollTo(0,j.scrolled);a.detachKeyboard();a.attachKeyboard(j.keymap);
+a._options.imageCrop=j.crop;var c=a.getData().big,d=a._controls.getActive().image;c&&c==d.src&&k.setTimeout(function(a){return function(){d.src=a}}(a.getData().image),1);a.rescale(function(){f.addTimer("fullscreen_exit",function(){f.show(a.getActiveImage());typeof b==="function"&&b.call(a)},50);a.trigger(Galleria.FULLSCREEN_EXIT)});u.unbind("resize",j.scale)}},i=this._idle={trunk:[],bound:!1,add:function(a,b){if(a){i.bound||i.addEvent();var a=e(a),c={},d;for(d in b)b.hasOwnProperty(d)&&(c[d]=a.css(d));
+a.data("idle",{from:c,to:b,complete:!0,busy:!1});i.addTimer();i.trunk.push(a)}},remove:function(b){b=jQuery(b);e.each(i.trunk,function(c,d){d.length&&!d.not(b).length&&(a._idle.show(b),a._idle.trunk.splice(c,1))});i.trunk.length||(i.removeEvent(),f.clearTimer("idle"))},addEvent:function(){i.bound=!0;a.$("container").bind("mousemove click",i.showAll)},removeEvent:function(){i.bound=!1;a.$("container").unbind("mousemove click",i.showAll)},addTimer:function(){f.addTimer("idle",function(){a._idle.hide()},
+a._options.idleTime)},hide:function(){a._options.idleMode&&(a.trigger(Galleria.IDLE_ENTER),e.each(i.trunk,function(b,c){var d=c.data("idle");if(d)c.data("idle").complete=!1,f.animate(c,d.to,{duration:a._options.idleSpeed})}))},showAll:function(){f.clearTimer("idle");e.each(a._idle.trunk,function(b,c){a._idle.show(c)})},show:function(b){var c=b.data("idle");if(!c.busy&&!c.complete)c.busy=!0,a.trigger(Galleria.IDLE_EXIT),f.clearTimer("idle"),f.animate(b,c.from,{duration:a._options.idleSpeed/2,complete:function(){e(this).data("idle").busy=
+!1;e(this).data("idle").complete=!0}});i.addTimer()}},g=this._lightbox={width:0,height:0,initialized:!1,active:null,image:null,elems:{},keymap:!1,init:function(){a.trigger(Galleria.LIGHTBOX_OPEN);if(!g.initialized){g.initialized=!0;var b={},c=a._options,d="",c={overlay:"position:fixed;display:none;opacity:"+c.overlayOpacity+";filter:alpha(opacity="+c.overlayOpacity*100+");top:0;left:0;width:100%;height:100%;background:"+c.overlayBackground+";z-index:99990",box:"position:fixed;display:none;width:400px;height:400px;top:50%;left:50%;margin-top:-200px;margin-left:-200px;z-index:99991",
+shadow:"position:absolute;background:#000;width:100%;height:100%;",content:"position:absolute;background-color:#fff;top:10px;left:10px;right:10px;bottom:10px;overflow:hidden",info:"position:absolute;bottom:10px;left:10px;right:10px;color:#444;font:11px/13px arial,sans-serif;height:13px",close:"position:absolute;top:10px;right:10px;height:20px;width:20px;background:#fff;text-align:center;cursor:pointer;color:#444;font:16px/22px arial,sans-serif;z-index:99999",image:"position:absolute;top:10px;left:10px;right:10px;bottom:30px;overflow:hidden;display:block;",
+prevholder:"position:absolute;width:50%;top:0;bottom:40px;cursor:pointer;",nextholder:"position:absolute;width:50%;top:0;bottom:40px;right:-1px;cursor:pointer;",prev:"position:absolute;top:50%;margin-top:-20px;height:40px;width:30px;background:#fff;left:20px;display:none;text-align:center;color:#000;font:bold 16px/36px arial,sans-serif",next:"position:absolute;top:50%;margin-top:-20px;height:40px;width:30px;background:#fff;right:20px;left:auto;display:none;font:bold 16px/36px arial,sans-serif;text-align:center;color:#000",
+title:"float:left",counter:"float:right;margin-left:8px;"},h={};q===8&&(c.nextholder+="background:#000;filter:alpha(opacity=0);",c.prevholder+="background:#000;filter:alpha(opacity=0);");e.each(c,function(a,b){d+=".galleria-lightbox-"+a+"{"+b+"}"});f.insertStyleTag(d);e.each("overlay box content shadow title info close prevholder prev nextholder next counter image".split(" "),function(c,d){a.addElement("lightbox-"+d);b[d]=g.elems[d]=a.get("lightbox-"+d)});g.image=new Galleria.Picture;e.each({box:"shadow content close prevholder nextholder",
+info:"title counter",content:"info image",prevholder:"prev",nextholder:"next"},function(a,b){var c=[];e.each(b.split(" "),function(a,b){c.push("lightbox-"+b)});h["lightbox-"+a]=c});a.append(h);e(b.image).append(g.image.container);e(v().body).append(b.overlay,b.box);f.optimizeTouch(b.box);(function(a){return a.hover(function(){e(this).css("color","#bbb")},function(){e(this).css("color","#444")})})(e(b.close).bind("click",g.hide).html("&#215;"));e.each(["Prev","Next"],function(a,c){var d=e(b[c.toLowerCase()]).html(/v/.test(c)?
+"&#8249;&nbsp;":"&nbsp;&#8250;"),f=e(b[c.toLowerCase()+"holder"]);f.bind("click",function(){g["show"+c]()});q<8||Galleria.TOUCH?d.show():f.hover(function(){d.show()},function(){d.stop().fadeOut(200)})});e(b.overlay).bind("click",g.hide);if(Galleria.IPAD)a._options.lightboxTransitionSpeed=0}},rescale:function(b){var c=Math.min(u.width()-40,g.width),d=Math.min(u.height()-60,g.height),d=Math.min(c/g.width,d/g.height),c=Math.round(g.width*d)+40,d=Math.round(g.height*d)+60,c={width:c,height:d,"margin-top":Math.ceil(d/
+2)*-1,"margin-left":Math.ceil(c/2)*-1};b?e(g.elems.box).css(c):e(g.elems.box).animate(c,{duration:a._options.lightboxTransitionSpeed,easing:a._options.easing,complete:function(){var b=g.image,c=a._options.lightboxFadeSpeed;a.trigger({type:Galleria.LIGHTBOX_IMAGE,imageTarget:b.image});e(b.container).show();f.show(b.image,c);f.show(g.elems.info,c)}})},hide:function(){g.image.image=null;u.unbind("resize",g.rescale);e(g.elems.box).hide();f.hide(g.elems.info);a.detachKeyboard();a.attachKeyboard(g.keymap);
+g.keymap=!1;f.hide(g.elems.overlay,200,function(){e(this).hide().css("opacity",a._options.overlayOpacity);a.trigger(Galleria.LIGHTBOX_CLOSE)})},showNext:function(){g.show(a.getNext(g.active))},showPrev:function(){g.show(a.getPrev(g.active))},show:function(b){g.active=b=typeof b==="number"?b:a.getIndex();g.initialized||g.init();if(!g.keymap)g.keymap=e.extend({},a._keyboard.map),a.attachKeyboard({escape:g.hide,right:g.showNext,left:g.showPrev});u.unbind("resize",g.rescale);var c=a.getData(b),d=a.getDataLength(),
+h=a.getNext(b),j,i,r;f.hide(g.elems.info);try{for(r=a._options.preload;r>0;r--)i=new Galleria.Picture,j=a.getData(h),i.preload("big"in j?j.big:j.image),h=a.getNext(h)}catch(k){}g.image.load(c.big||c.image,function(a){g.width=a.original.width;g.height=a.original.height;e(a.image).css({width:"100.5%",height:"100.5%",top:0,zIndex:99998});f.hide(a.image);g.elems.title.innerHTML=c.title||"";g.elems.counter.innerHTML=b+1+" / "+d;u.resize(g.rescale);g.rescale()});e(g.elems.overlay).show();e(g.elems.box).show()}};
+return this};Galleria.prototype={constructor:Galleria,init:function(a,b){b=K(b);this._original={target:a,options:b,data:null};this._target=this._dom.target=a.nodeName?a:e(a).get(0);y.push(this);if(this._target){this._options={autoplay:!1,carousel:!0,carouselFollow:!0,carouselSpeed:400,carouselSteps:"auto",clicknext:!1,dataConfig:function(){return{}},dataSelector:"img",dataSource:this._target,debug:void 0,dummy:void 0,easing:"galleria",extend:function(){},fullscreenCrop:void 0,fullscreenDoubleTap:!0,
+fullscreenTransition:void 0,height:"auto",idleMode:!0,idleTime:3E3,idleSpeed:200,imageCrop:!1,imageMargin:0,imagePan:!1,imagePanSmoothness:12,imagePosition:"50%",imageTimeout:void 0,initialTransition:void 0,keepSource:!1,layerFollow:!0,lightbox:!1,lightboxFadeSpeed:200,lightboxTransitionSpeed:200,linkSourceImages:!0,maxScaleRatio:void 0,minScaleRatio:void 0,overlayOpacity:0.85,overlayBackground:"#0b0b0b",pauseOnInteraction:!0,popupLinks:!1,preload:2,queue:!0,show:0,showInfo:!0,showCounter:!0,showImagenav:!0,
+swipe:!0,thumbCrop:!0,thumbEventType:"click",thumbFit:!0,thumbMargin:0,thumbQuality:"auto",thumbnails:!0,touchTransition:void 0,transition:"fade",transitionInitial:void 0,transitionSpeed:400,useCanvas:!1,width:"auto"};this._options.initialTransition=this._options.initialTransition||this._options.transitionInitial;b&&b.debug===!1&&(H=!1);if(b&&typeof b.imageTimeout==="number")A=b.imageTimeout;if(b&&typeof b.dummy==="string")B=b.dummy;e(this._target).children().hide();typeof Galleria.theme==="object"?
+this._init():M.push(this);return this}else Galleria.raise("Target not found.",!0)},_init:function(){var a=this,b=this._options;if(this._initialized)return Galleria.raise("Init failed: Gallery instance already initialized."),this;this._initialized=!0;if(!Galleria.theme)return Galleria.raise("Init failed: No theme found."),this;e.extend(!0,b,Galleria.theme.defaults,this._original.options);(function(a){"getContext"in a&&(t=t||{elem:a,context:a.getContext("2d"),cache:{},length:0})})(m.createElement("canvas"));
+this.bind(Galleria.DATA,function(){Galleria.QUIRK&&Galleria.raise("Your page is in Quirks mode, Galleria may not render correctly. Please validate your HTML.");this._original.data=this._data;this.get("total").innerHTML=this.getDataLength();var c=this.$("container"),d={width:0,height:0},i=function(){return a.$("stage").height()};f.wait({until:function(){e.each(["width","height"],function(e,i){d[i]=b[i]&&typeof b[i]==="number"?b[i]:Math.max(f.parseValue(c.css(i)),f.parseValue(a.$("target").css(i)),
+c[i](),a.$("target")[i]());c[i](d[i])});return i()&&d.width&&d.height>10},success:function(){Galleria.WEBKIT?k.setTimeout(function(){a._run()},1):a._run()},error:function(){i()?Galleria.raise("Could not extract sufficient width/height of the gallery container. Traced measures: width:"+d.width+"px, height: "+d.height+"px.",!0):Galleria.raise("Could not extract a stage height from the CSS. Traced height: "+i()+"px.",!0)},timeout:1E4})});this.append({"info-text":["info-title","info-description"],info:["info-text"],
+"image-nav":["image-nav-right","image-nav-left"],stage:["images","loader","counter","image-nav"],"thumbnails-list":["thumbnails"],"thumbnails-container":["thumb-nav-left","thumbnails-list","thumb-nav-right"],container:["stage","thumbnails-container","info","tooltip"]});f.hide(this.$("counter").append(this.get("current"),m.createTextNode(" / "),this.get("total")));this.setCounter("&#8211;");f.hide(a.get("tooltip"));this.$("container").addClass(Galleria.TOUCH?"touch":"notouch");e.each(Array(2),function(b){var c=
+new Galleria.Picture;e(c.container).css({position:"absolute",top:0,left:0}).prepend(a._layers[b]=e(f.create("galleria-layer")).css({position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:2})[0]);a.$("images").append(c.container);a._controls[b]=c});this.$("images").css({position:"relative",top:0,left:0,width:"100%",height:"100%"});this.$("thumbnails, thumbnails-list").css({overflow:"hidden",position:"relative"});this.$("image-nav-right, image-nav-left").bind("click",function(c){b.clicknext&&c.stopPropagation();
+b.pauseOnInteraction&&a.pause();c=/right/.test(this.className)?"next":"prev";a[c]()});e.each(["info","counter","image-nav"],function(c,d){b["show"+d.substr(0,1).toUpperCase()+d.substr(1).replace(/-/,"")]===!1&&f.moveOut(a.get(d.toLowerCase()))});this.load();if(!b.keepSource&&!q)this._target.innerHTML="";this.get("errors")&&this.appendChild("target","errors");this.appendChild("target","container");if(b.carousel){var d=0,c=b.show;this.bind(Galleria.THUMBNAIL,function(){this.updateCarousel();++d==this.getDataLength()&&
+typeof c=="number"&&c>0&&this._carousel.follow(c)})}b.swipe&&(function(b){var c=[0,0],d=[0,0],e=!1,l=0,p,n={start:"touchstart",move:"touchmove",stop:"touchend"},k=function(a){a.originalEvent.touches&&a.originalEvent.touches.length>1||(p=a.originalEvent.touches?a.originalEvent.touches[0]:a,d=[p.pageX,p.pageY],c[0]||(c=d),Math.abs(c[0]-d[0])>10&&a.preventDefault())},o=function(s){b.unbind(n.move,k);s.originalEvent.touches&&s.originalEvent.touches.length||e?e=!e:(f.timestamp()-l<1E3&&Math.abs(c[0]-d[0])>
+30&&Math.abs(c[1]-d[1])<100&&(s.preventDefault(),a[c[0]>d[0]?"next":"prev"]()),c=d=[0,0])};b.bind(n.start,function(a){a.originalEvent.touches&&a.originalEvent.touches.length>1||(p=a.originalEvent.touches?a.originalEvent.touches[0]:a,l=f.timestamp(),c=d=[p.pageX,p.pageY],b.bind(n.move,k).one(n.stop,o))})}(a.$("images")),b.fullscreenDoubleTap&&this.$("stage").bind("touchstart",function(){var b,c,d,e,f,p;return function(n){p=Galleria.utils.timestamp();c=(n.originalEvent.touches?n.originalEvent.touches[0]:
+n).pageX;d=(n.originalEvent.touches?n.originalEvent.touches[0]:n).pageY;p-b<500&&c-e<20&&d-f<20?(a.toggleFullscreen(),n.preventDefault(),a.$("stage").unbind("touchend",arguments.callee)):(b=p,e=c,f=d)}}()));f.optimizeTouch(this.get("container"));return this},_createThumbnails:function(){this.get("total").innerHTML=this.getDataLength();var a,b,d,c,h,j=this,i=this._options,g=function(){var a=j.$("thumbnails").find(".active");return!a.length?!1:a.find("img").attr("src")}(),l=typeof i.thumbnails==="string"?
+i.thumbnails.toLowerCase():null,p=function(a){return m.defaultView&&m.defaultView.getComputedStyle?m.defaultView.getComputedStyle(d.container,null)[a]:h.css(a)},n=function(a,b,c){return function(){e(c).append(a);j.trigger({type:Galleria.THUMBNAIL,thumbTarget:a,index:b})}},q=function(a){i.pauseOnInteraction&&j.pause();var b=e(a.currentTarget).data("index");j.getIndex()!==b&&j.show(b);a.preventDefault()},o=function(a){a.scale({width:a.data.width,height:a.data.height,crop:i.thumbCrop,margin:i.thumbMargin,
+canvas:i.useCanvas,complete:function(a){var b=["left","top"],c,d;e.each(["Width","Height"],function(f,h){c=h.toLowerCase();if((i.thumbCrop!==!0||i.thumbCrop===c)&&i.thumbFit)d={},d[c]=a[c],e(a.container).css(d),d={},d[b[f]]=0,e(a.image).css(d);a["outer"+h]=e(a.container)["outer"+h](!0)});f.toggleQuality(a.image,i.thumbQuality===!0||i.thumbQuality==="auto"&&a.original.width<a.width*3);j.trigger({type:Galleria.THUMBNAIL,thumbTarget:a.image,index:a.data.order})}})};this._thumbnails=[];this.$("thumbnails").empty();
+for(a=0;this._data[a];a++)c=this._data[a],i.thumbnails===!0?(d=new Galleria.Picture(a),b=c.thumb||c.image,this.$("thumbnails").append(d.container),h=e(d.container),d.data={width:f.parseValue(p("width")),height:f.parseValue(p("height")),order:a},i.thumbFit&&i.thumbCrop!==!0?h.css({width:0,height:0}):h.css({width:d.data.width,height:d.data.height}),d.load(b,o),i.preload==="all"&&d.preload(c.image)):l==="empty"||l==="numbers"?(d={container:f.create("galleria-image"),image:f.create("img","span"),ready:!0},
+l==="numbers"&&e(d.image).text(a+1),this.$("thumbnails").append(d.container),k.setTimeout(n(d.image,a,d.container),50+a*20)):d={container:null,image:null},e(d.container).add(i.keepSource&&i.linkSourceImages?c.original:null).data("index",a).bind(i.thumbEventType,q),g===b&&e(d.container).addClass("active"),this._thumbnails.push(d)},_run:function(){var a=this;a._createThumbnails();f.wait({until:function(){Galleria.OPERA&&a.$("stage").css("display","inline-block");a._stageWidth=a.$("stage").width();a._stageHeight=
+a.$("stage").height();return a._stageWidth&&a._stageHeight>50},success:function(){z.push(a);f.show(a.get("counter"));a._options.carousel&&a._carousel.bindControls();if(a._options.autoplay){a.pause();if(typeof a._options.autoplay==="number")a._playtime=a._options.autoplay;a.trigger(Galleria.PLAY);a._playing=!0}a._firstrun?typeof a._options.show==="number"&&a.show(a._options.show):(a._firstrun=!0,a._options.clicknext&&!Galleria.TOUCH&&(e.each(a._data,function(a,d){delete d.link}),a.$("stage").css({cursor:"pointer"}).bind("click",
+function(){a._options.pauseOnInteraction&&a.pause();a.next()})),Galleria.History&&Galleria.History.change(function(b){isNaN(b)?k.history.go(-1):a.show(b,void 0,!0)}),e.each(Galleria.ready.callbacks,function(){this.call(a,a._options)}),a.trigger(Galleria.READY),Galleria.theme.init.call(a,a._options),a._options.extend.call(a,a._options),/^[0-9]{1,4}$/.test(I)&&Galleria.History?a.show(I,void 0,!0):a._data[a._options.show]&&a.show(a._options.show))},error:function(){Galleria.raise("Stage width or height is too small to show the gallery. Traced measures: width:"+
+a._stageWidth+"px, height: "+a._stageHeight+"px.",!0)}})},load:function(a,b,d){var c=this;this._data=[];this._thumbnails=[];this.$("thumbnails").empty();typeof b==="function"&&(d=b,b=null);a=a||this._options.dataSource;b=b||this._options.dataSelector;d=d||this._options.dataConfig;/^function Object/.test(a.constructor)&&(a=[a]);if(a.constructor===Array)return this.validate(a)?(this._data=a,this._parseData().trigger(Galleria.DATA)):Galleria.raise("Load failed: JSON Array not valid."),this;e(a).find(b).each(function(a,
+b){var b=e(b),f={},g=b.parent(),l=g.attr("href"),g=g.attr("rel");if(l)f.image=f.big=l;if(g)f.big=g;c._data.push(e.extend({title:b.attr("title")||"",thumb:b.attr("src"),image:b.attr("src"),big:b.attr("src"),description:b.attr("alt")||"",link:b.attr("longdesc"),original:b.get(0)},f,d(b)))});this.getDataLength()?this.trigger(Galleria.DATA):Galleria.raise("Load failed: no data found.");return this},_parseData:function(){var a=this;e.each(this._data,function(b,d){if("thumb"in d===!1)a._data[b].thumb=d.image;
+if(!1 in d)a._data[b].big=d.image});return this},splice:function(){Array.prototype.splice.apply(this._data,f.array(arguments));return this._parseData()._createThumbnails()},push:function(){Array.prototype.push.apply(this._data,f.array(arguments));return this._parseData()._createThumbnails()},_getActive:function(){return this._controls.getActive()},validate:function(){return!0},bind:function(a,b){a=C(a);this.$("container").bind(a,this.proxy(b));return this},unbind:function(a){a=C(a);this.$("container").unbind(a);
+return this},trigger:function(a){a=typeof a==="object"?e.extend(a,{scope:this}):{type:C(a),scope:this};this.$("container").trigger(a);return this},addIdleState:function(a,b){this._idle.add.apply(this._idle,f.array(arguments));return this},removeIdleState:function(a){this._idle.remove.apply(this._idle,f.array(arguments));return this},enterIdleMode:function(){this._idle.hide();return this},exitIdleMode:function(){this._idle.showAll();return this},enterFullscreen:function(a){this._fullscreen.enter.apply(this,
+f.array(arguments));return this},exitFullscreen:function(a){this._fullscreen.exit.apply(this,f.array(arguments));return this},toggleFullscreen:function(a){this._fullscreen[this.isFullscreen()?"exit":"enter"].apply(this,f.array(arguments));return this},bindTooltip:function(a,b){this._tooltip.bind.apply(this._tooltip,f.array(arguments));return this},defineTooltip:function(a,b){this._tooltip.define.apply(this._tooltip,f.array(arguments));return this},refreshTooltip:function(a){this._tooltip.show.apply(this._tooltip,
+f.array(arguments));return this},openLightbox:function(){this._lightbox.show.apply(this._lightbox,f.array(arguments));return this},closeLightbox:function(){this._lightbox.hide.apply(this._lightbox,f.array(arguments));return this},getActiveImage:function(){return this._getActive().image||void 0},getActiveThumb:function(){return this._thumbnails[this._active].image||void 0},getMousePosition:function(a){return{x:a.pageX-this.$("container").offset().left,y:a.pageY-this.$("container").offset().top}},addPan:function(a){if(this._options.imageCrop!==
+!1){var a=e(a||this.getActiveImage()),b=this,d=a.width()/2,c=a.height()/2,h=parseInt(a.css("left"),10),j=parseInt(a.css("top"),10),i=h||0,g=j||0,l=0,p=0,n=!1,k=f.timestamp(),o=0,s=0,r=function(b,c,d){if(b>0&&(s=Math.round(Math.max(b*-1,Math.min(0,c))),o!==s))if(o=s,q===8)a.parent()["scroll"+d](s*-1);else b={},b[d.toLowerCase()]=s,a.css(b)},m=function(a){if(!(f.timestamp()-k<50))n=!0,d=b.getMousePosition(a).x,c=b.getMousePosition(a).y};q===8&&(a.parent().scrollTop(g*-1).scrollLeft(i*-1),a.css({top:0,
+left:0}));this.$("stage").unbind("mousemove",m).bind("mousemove",m);f.addTimer("pan",function(){n&&(l=a.width()-b._stageWidth,p=a.height()-b._stageHeight,h=d/b._stageWidth*l*-1,j=c/b._stageHeight*p*-1,i+=(h-i)/b._options.imagePanSmoothness,g+=(j-g)/b._options.imagePanSmoothness,r(p,g,"Top"),r(l,i,"Left"))},50,!0);return this}},proxy:function(a,b){if(typeof a!=="function")return function(){};b=b||this;return function(){return a.apply(b,f.array(arguments))}},removePan:function(){this.$("stage").unbind("mousemove");
+f.clearTimer("pan");return this},addElement:function(a){var b=this._dom;e.each(f.array(arguments),function(a,c){b[c]=f.create("galleria-"+c)});return this},attachKeyboard:function(a){this._keyboard.attach.apply(this._keyboard,f.array(arguments));return this},detachKeyboard:function(){this._keyboard.detach.apply(this._keyboard,f.array(arguments));return this},appendChild:function(a,b){this.$(a).append(this.get(b)||b);return this},prependChild:function(a,b){this.$(a).prepend(this.get(b)||b);return this},
+remove:function(a){this.$(f.array(arguments).join(",")).remove();return this},append:function(a){var b,d;for(b in a)if(a.hasOwnProperty(b))if(a[b].constructor===Array)for(d=0;a[b][d];d++)this.appendChild(b,a[b][d]);else this.appendChild(b,a[b]);return this},_scaleImage:function(a,b){if(a=a||this._controls.getActive()){var d,c=function(a){e(a.container).children(":first").css({top:Math.max(0,f.parseValue(a.image.style.top)),left:Math.max(0,f.parseValue(a.image.style.left)),width:f.parseValue(a.image.width),
+height:f.parseValue(a.image.height)})},b=e.extend({width:this._stageWidth,height:this._stageHeight,crop:this._options.imageCrop,max:this._options.maxScaleRatio,min:this._options.minScaleRatio,margin:this._options.imageMargin,position:this._options.imagePosition},b);this._options.layerFollow&&this._options.imageCrop!==!0?typeof b.complete=="function"?(d=b.complete,b.complete=function(){d.call(a,a);c(a)}):b.complete=c:e(a.container).children(":first").css({top:0,left:0});a.scale(b);return this}},updateCarousel:function(){this._carousel.update();
+return this},rescale:function(a,b,d){var c=this;typeof a==="function"&&(d=a,a=void 0);var e=function(){c._stageWidth=a||c.$("stage").width();c._stageHeight=b||c.$("stage").height();c._scaleImage();c._options.carousel&&c.updateCarousel();c.trigger(Galleria.RESCALE);typeof d==="function"&&d.call(c)};Galleria.WEBKIT&&!a&&!b?f.addTimer("scale",e,10):e.call(c);return this},refreshImage:function(){this._scaleImage();this._options.imagePan&&this.addPan();return this},show:function(a,b,d){if(!(a===!1||!this._options.queue&&
+this._queue.stalled))if(a=Math.max(0,Math.min(parseInt(a,10),this.getDataLength()-1)),b=typeof b!=="undefined"?!!b:a<this.getIndex(),!d&&Galleria.History)Galleria.History.set(a.toString());else return this._active=a,Array.prototype.push.call(this._queue,{index:a,rewind:b}),this._queue.stalled||this._show(),this},_show:function(){var a=this,b=this._queue[0],d=this.getData(b.index);if(d){var c=this.isFullscreen()&&"big"in d?d.big:d.image,h=this._controls.getActive(),j=this._controls.getNext(),i=j.isCached(c),
+g=this._thumbnails[b.index],l=function(b,c,d,i,h){return function(){a._queue.stalled=!1;f.toggleQuality(c.image,a._options.imageQuality);a._layers[a._controls.active].innerHTML="";e(d.container).css({zIndex:0,opacity:0}).show();e(c.container).css({zIndex:1}).show();a._controls.swap();a._options.imagePan&&a.addPan(c.image);(b.link||a._options.lightbox)&&e(c.image).css({cursor:"pointer"}).bind("mouseup",function(){b.link?a._options.popupLinks?k.open(b.link,"_blank"):k.location.href=b.link:a.openLightbox()});
+Array.prototype.shift.call(a._queue);a._queue.length&&a._show();a._playCheck();a.trigger({type:Galleria.IMAGE,index:i.index,imageTarget:c.image,thumbTarget:h.image})}}(d,j,h,b,g);this._options.carousel&&this._options.carouselFollow&&this._carousel.follow(b.index);if(this._options.preload){var p,n,m=this.getNext(),o;try{for(n=this._options.preload;n>0;n--)p=new Galleria.Picture,o=a.getData(m),p.preload(this.isFullscreen()&&"big"in o?o.big:o.image),m=a.getNext(m)}catch(s){}}f.show(j.container);e(a._thumbnails[b.index].container).addClass("active").siblings(".active").removeClass("active");
+a.trigger({type:Galleria.LOADSTART,cached:i,index:b.index,rewind:b.rewind,imageTarget:j.image,thumbTarget:g.image});j.load(c,function(c){var g=e(a._layers[1-a._controls.active]).html(d.layer||"").hide();a._scaleImage(c,{complete:function(c){"image"in h&&f.toggleQuality(h.image,!1);f.toggleQuality(c.image,!1);a._queue.stalled=!0;a.removePan();a.setInfo(b.index);a.setCounter(b.index);if(d.layer&&(g.show(),d.link||a._options.clicknext))g.css("cursor","pointer").one("click",function(){d.link?e(c.image).trigger("mouseup"):
+a.$("stage").trigger("click")});a.trigger({type:Galleria.LOADFINISH,cached:i,index:b.index,rewind:b.rewind,imageTarget:c.image,thumbTarget:a._thumbnails[b.index].image});var j=a._options.transition;e.each({initial:h.image===null,touch:Galleria.TOUCH,fullscreen:a.isFullscreen()},function(b,c){if(c&&a._options[b+"Transition"]!==void 0)return j=a._options[b+"Transition"],!1});j in F===!1?l():F[j].call(a,{prev:h.container,next:c.container,rewind:b.rewind,speed:a._options.transitionSpeed||400},l)}})})}},
+getNext:function(a){a=typeof a==="number"?a:this.getIndex();return a===this.getDataLength()-1?0:a+1},getPrev:function(a){a=typeof a==="number"?a:this.getIndex();return a===0?this.getDataLength()-1:a-1},next:function(){this.getDataLength()>1&&this.show(this.getNext(),!1);return this},prev:function(){this.getDataLength()>1&&this.show(this.getPrev(),!0);return this},get:function(a){return a in this._dom?this._dom[a]:null},getData:function(a){return a in this._data?this._data[a]:this._data[this._active]},
+getDataLength:function(){return this._data.length},getIndex:function(){return typeof this._active==="number"?this._active:!1},getStageHeight:function(){return this._stageHeight},getStageWidth:function(){return this._stageWidth},getOptions:function(a){return typeof a==="undefined"?this._options:this._options[a]},setOptions:function(a,b){typeof a==="object"?e.extend(this._options,a):this._options[a]=b;return this},play:function(a){this._playing=!0;this._playtime=a||this._playtime;this._playCheck();
+this.trigger(Galleria.PLAY);return this},pause:function(){this._playing=!1;this.trigger(Galleria.PAUSE);return this},playToggle:function(a){return this._playing?this.pause():this.play(a)},isPlaying:function(){return this._playing},isFullscreen:function(){return this._fullscreen.active},_playCheck:function(){var a=this,b=0,d=f.timestamp(),c="play"+this._id;if(this._playing){f.clearTimer(c);var e=function(){b=f.timestamp()-d;b>=a._playtime&&a._playing?(f.clearTimer(c),a.next()):a._playing&&(a.trigger({type:Galleria.PROGRESS,
+percent:Math.ceil(b/a._playtime*100),seconds:Math.floor(b/1E3),milliseconds:b}),f.addTimer(c,e,20))};f.addTimer(c,e,20)}},setPlaytime:function(a){this._playtime=a;return this},setIndex:function(a){this._active=a;return this},setCounter:function(a){typeof a==="number"?a++:typeof a==="undefined"&&(a=this.getIndex()+1);this.get("current").innerHTML=a;if(q){var a=this.$("counter"),b=a.css("opacity");parseInt(b,10)===1?f.removeAlpha(a[0]):this.$("counter").css("opacity",b)}return this},setInfo:function(a){var b=
+this,d=this.getData(a);e.each(["title","description"],function(a,e){var f=b.$("info-"+e);d[e]?f[d[e].length?"show":"hide"]().html(d[e]):f.empty().hide()});return this},hasInfo:function(a){var b="title description".split(" "),d;for(d=0;b[d];d++)if(this.getData(a)[b[d]])return!0;return!1},jQuery:function(a){var b=this,d=[];e.each(a.split(","),function(a,c){c=e.trim(c);b.get(c)&&d.push(c)});var c=e(b.get(d.shift()));e.each(d,function(a,d){c=c.add(b.get(d))});return c},$:function(a){return this.jQuery.apply(this,
+f.array(arguments))}};e.each(J,function(a,b){var d=/_/.test(b)?b.replace(/_/g,""):b;Galleria[b.toUpperCase()]="galleria."+d});e.extend(Galleria,{IE9:q===9,IE8:q===8,IE7:q===7,IE6:q===6,IE:q,WEBKIT:/webkit/.test(x),SAFARI:/safari/.test(x),CHROME:/chrome/.test(x),QUIRK:q&&m.compatMode&&m.compatMode==="BackCompat",MAC:/mac/.test(navigator.platform.toLowerCase()),OPERA:!!k.opera,IPHONE:/iphone/.test(x),IPAD:/ipad/.test(x),ANDROID:/android/.test(x),TOUCH:"ontouchstart"in m});Galleria.addTheme=function(a){a.name||
+Galleria.raise("No theme name specified");a.defaults=typeof a.defaults!=="object"?{}:K(a.defaults);var b=!1,d;typeof a.css==="string"?(e("link").each(function(c,e){d=RegExp(a.css);if(d.test(e.href))return b=!0,D(a),!1}),b||e("script").each(function(c,e){d=RegExp("galleria\\."+a.name.toLowerCase()+"\\.");d.test(e.src)&&(b=e.src.replace(/[^\/]*$/,"")+a.css,f.addTimer("css",function(){f.loadCSS(b,"galleria-theme",function(){D(a)})},1))}),b||Galleria.raise("No theme CSS loaded")):D(a);return a};Galleria.loadTheme=
+function(a,b){var d=z.length,c=k.setTimeout(function(){Galleria.raise("Theme at "+a+" could not load, check theme path.",!0)},5E3);Galleria.theme=void 0;f.loadScript(a,function(){k.clearTimeout(c);if(d){var a=[];e.each(Galleria.get(),function(c,d){var f=e.extend(d._original.options,{data_source:d._data},b);d.$("container").remove();var l=new Galleria;l._id=d._id;l.init(d._original.target,f);a.push(l)});z=a}})};Galleria.get=function(a){if(y[a])return y[a];else if(typeof a!=="number")return y;else Galleria.raise("Gallery index "+
+a+" not found")};Galleria.addTransition=function(a,b){F[a]=b};Galleria.utils=f;Galleria.log=function(){return"console"in k&&"log"in k.console?k.console.log:function(){k.alert(f.array(arguments).join(", "))}}();Galleria.ready=function(a){e.each(z,function(b,d){a.call(d,d._options)});Galleria.ready.callbacks.push(a)};Galleria.ready.callbacks=[];Galleria.raise=function(a,b){var d=b?"Fatal error":"Error",c=function(a){var c='<div style="padding:4px;margin:0 0 2px;background:#'+(b?"811":"222")+'";>'+(b?
+"<strong>"+d+": </strong>":"")+a+"</div>";e.each(y,function(){var a=this.$("errors"),b=this.$("target");a.length||(b.css("position","relative"),a=this.addElement("errors").appendChild("target","errors").$("errors").css({color:"#fff",position:"absolute",top:0,left:0,zIndex:1E5}));a.append(c)})};if(H){if(c(a),b)throw Error(d+": "+a);}else b&&!L&&(L=!0,b=!1,c("Image gallery could not load."))};Galleria.version=1.26;Galleria.requires=function(a,b){Galleria.version<a&&Galleria.raise(b||"You need to upgrade Galleria to version "+
+a+" to use one or more components.",!0)};Galleria.Picture=function(a){this.id=a||null;this.image=null;this.container=f.create("galleria-image");e(this.container).css({overflow:"hidden",position:"relative"});this.original={width:0,height:0};this.ready=!1;this.tid=null};Galleria.Picture.prototype={cache:{},show:function(){f.show(this.image)},hide:function(){f.moveOut(this.image)},clear:function(){this.image=null},isCached:function(a){return!!this.cache[a]},preload:function(a){e(new Image).load(function(a,
+d){return function(){d[a]=a}}(a,this.cache)).attr("src",a)},load:function(a,b){this.tid=k.setTimeout(function(a){return function(){Galleria.raise("Image not loaded in "+Math.round(A/1E3)+" seconds: "+a)}}(a),A);this.image=new Image;var d=!1,c=e(this.container),h=e(this.image),j=function(a,b,c){return function(){var d=function(){e(this).unbind("load");a.original={height:this.height,width:this.width};a.cache[c]=c;k.clearTimeout(a.tid);typeof b=="function"&&k.setTimeout(function(){b.call(a,a)},1)};!this.width||
+!this.height?k.setTimeout(function(a){return function(){a.width&&a.height?d.call(a):Galleria.raise("Could not extract width/height from image: "+a.src+". Traced measures: width:"+a.width+"px, height: "+a.height+"px.")}}(this),2):d.call(this)}}(this,b,a);c.find("img").remove();h.css("display","block").appendTo(this.container);f.hide(this.image);if(this.cache[a])return e(this.image).load(j).attr("src",a),this.container;e(this.image).load(j).error(function(){d?B?e(this).attr("src",B):Galleria.raise("Image not found: "+
+a):(d=!0,k.setTimeout(function(a,b){return function(){a.attr("src",b+"?"+f.timestamp())}}(e(this),a),50))}).attr("src",a);return this.container},scale:function(a){a=e.extend({width:0,height:0,min:void 0,max:void 0,margin:0,complete:function(){},position:"center",crop:!1,canvas:!1},a);if(!this.image)return this.container;var b,d,c=this,h=e(c.container),j;f.wait({until:function(){b=a.width||h.width()||f.parseValue(h.css("width"));d=a.height||h.height()||f.parseValue(h.css("height"));return b&&d},success:function(){var i=
+(b-a.margin*2)/c.original.width,g=(d-a.margin*2)/c.original.height,h={"true":Math.max(i,g),width:i,height:g,"false":Math.min(i,g)}[a.crop.toString()],i="";a.max&&(h=Math.min(a.max,h));a.min&&(h=Math.max(a.min,h));e.each(["width","height"],function(a,b){e(c.image)[b](c[b]=c.image[b]=Math.round(c.original[b]*h))});e(c.container).width(b).height(d);if(a.canvas&&t)t.elem.width=c.width,t.elem.height=c.height,i=c.image.src+":"+c.width+"x"+c.height,c.image.src=t.cache[i]||function(a){t.context.drawImage(c.image,
+0,0,c.original.width*h,c.original.height*h);try{return j=t.elem.toDataURL(),t.length+=j.length,t.cache[a]=j}catch(b){return c.image.src}}(i);var k={},n={},i=function(a,b,d){var h=0;/\%/.test(a)?(a=parseInt(a,10)/100,b=c.image[b]||e(c.image)[b](),h=Math.ceil(b*-1*a+d*a)):h=f.parseValue(a);return h},m={top:{top:0},left:{left:0},right:{left:"100%"},bottom:{top:"100%"}};e.each(a.position.toLowerCase().split(" "),function(a,b){b==="center"&&(b="50%");k[a?"top":"left"]=b});e.each(k,function(a,b){m.hasOwnProperty(b)&&
+e.extend(n,m[b])});k=k.top?e.extend(k,n):n;k=e.extend({top:"50%",left:"50%"},k);e(c.image).css({position:"absolute",top:i(k.top,"height",d),left:i(k.left,"width",b)});c.show();c.ready=!0;a.complete.call(c,c)},error:function(){Galleria.raise("Could not scale image: "+c.image.src)},timeout:1E3});return this}};e.extend(e.easing,{galleria:function(a,b,d,c,e){return(b/=e/2)<1?c/2*b*b*b+d:c/2*((b-=2)*b*b+2)+d},galleriaIn:function(a,b,d,c,e){return c*(b/=e)*b+d},galleriaOut:function(a,b,d,c,e){return-c*
+(b/=e)*(b-2)+d}});e.fn.galleria=function(a){return this.each(function(){e(this).data("galleria",(new Galleria).init(this,a))})}})(jQuery);
Index: /extensions/stripped_galleria/galleria/plugins/history/galleria.history.js
===================================================================
--- /extensions/stripped_galleria/galleria/plugins/history/galleria.history.js	(revision 12977)
+++ /extensions/stripped_galleria/galleria/plugins/history/galleria.history.js	(revision 12977)
@@ -0,0 +1,146 @@
+/**
+ * @preserve Galleria History Plugin 2011-08-01
+ * http://galleria.aino.se
+ *
+ * Copyright 2011, Aino
+ * Licensed under the MIT license.
+ *
+ */
+
+/*global jQuery, Galleria, window */
+
+Galleria.requires(1.25, 'The History Plugin requires Galleria version 1.2.5 or later.');
+
+(function( $, window ) {
+
+    Galleria.History = (function() {
+
+        var onloads = [],
+
+            init = false,
+
+            loc = window.location,
+
+            doc = window.document,
+
+            ie = Galleria.IE,
+
+            support = 'onhashchange' in window && ( doc.mode === undefined || doc.mode > 7 ),
+
+            iframe,
+
+            get = function( winloc ) {
+                if( iframe && !support && Galleria.IE ) {
+                    winloc = winloc || iframe.location;
+                }  else {
+                    winloc = loc;
+                }
+                return parseInt( winloc.hash.substr(2), 10 );
+            },
+
+            saved = get( loc ),
+
+            callbacks = [],
+
+            onchange = function() {
+                $.each( callbacks, function( i, fn ) {
+                    fn.call( window, get() );
+                });
+            },
+
+            ready = function() {
+                $.each( onloads, function(i, fn) {
+                    fn();
+                });
+
+                init = true;
+            },
+
+            setHash = function( val ) {
+                return '/' + val;
+            };
+
+        // always remove support if IE < 8
+        if ( support && ie < 8 ) {
+            support = false;
+        }
+
+        if ( !support ) {
+
+            $(function() {
+
+                var interval = window.setInterval(function() {
+
+                    var hash = get();
+
+                    if ( !isNaN( hash ) && hash != saved ) {
+                        saved = hash;
+                        loc.hash = setHash( hash );
+                        onchange();
+                    }
+
+                }, 50);
+
+                if ( ie ) {
+
+                    $('<iframe tabindex="-1" title="empty">').hide().attr( 'src', 'about:blank' ).one('load', function() {
+
+                        iframe = this.contentWindow;
+
+                        ready();
+
+                    }).insertAfter(doc.body);
+
+                } else {
+                    ready();
+                }
+            });
+        } else {
+            ready();
+        }
+
+        return {
+
+            change: function( fn ) {
+
+                callbacks.push( fn );
+
+                if( support ) {
+                    window.onhashchange = onchange;
+                }
+            },
+
+            set: function( val ) {
+
+                if ( isNaN( val ) ) {
+                    return;
+                }
+
+                if ( !support && ie ) {
+
+                    this.ready(function() {
+
+                        var idoc = iframe.document;
+                        idoc.open();
+                        idoc.close();
+
+                        iframe.location.hash = setHash( val );
+
+                    });
+                }
+
+                loc.hash = setHash( val );
+            },
+
+            ready: function(fn) {
+                if (!init) {
+                    onloads.push(fn);
+                } else {
+                    fn();
+                }
+            }
+        };
+    }());
+
+}( jQuery, this ));
+
Index: /extensions/stripped_galleria/galleria/plugins/history/galleria.history.min.js
===================================================================
--- /extensions/stripped_galleria/galleria/plugins/history/galleria.history.min.js	(revision 12977)
+++ /extensions/stripped_galleria/galleria/plugins/history/galleria.history.min.js	(revision 12977)
@@ -0,0 +1,11 @@
+/*
+ Galleria History Plugin 2011-08-01
+ http://galleria.aino.se
+
+ Copyright 2011, Aino
+ Licensed under the MIT license.
+
+*/
+Galleria.requires(1.25,"The History Plugin requires Galleria version 1.2.5 or later.");
+(function(e,c){Galleria.History=function(){var k=[],l=!1,f=c.location,g=c.document,h=Galleria.IE,b="onhashchange"in c&&(g.mode===void 0||g.mode>7),d,i=function(a){a=d&&!b&&Galleria.IE?a||d.location:f;return parseInt(a.hash.substr(2),10)},m=i(f),n=[],o=function(){e.each(n,function(a,b){b.call(c,i())})},j=function(){e.each(k,function(a,b){b()});l=!0};b&&h<8&&(b=!1);b?j():e(function(){c.setInterval(function(){var a=i();if(!isNaN(a)&&a!=m)m=a,f.hash="/"+a,o()},50);h?e('<iframe tabindex="-1" title="empty">').hide().attr("src",
+"about:blank").one("load",function(){d=this.contentWindow;j()}).insertAfter(g.body):j()});return{change:function(a){n.push(a);if(b)c.onhashchange=o},set:function(a){if(!isNaN(a))!b&&h&&this.ready(function(){var b=d.document;b.open();b.close();d.location.hash="/"+a}),f.hash="/"+a},ready:function(a){l?a():k.push(a)}}}()})(jQuery,this);
Index: /extensions/stripped_galleria/galleria/plugins/history/history-demo.html
===================================================================
--- /extensions/stripped_galleria/galleria/plugins/history/history-demo.html	(revision 12977)
+++ /extensions/stripped_galleria/galleria/plugins/history/history-demo.html	(revision 12977)
@@ -0,0 +1,100 @@
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <meta charset="utf-8">
+        <title>Galleria History Plugin</title>
+        <style>
+
+            /* Demo styles */
+            html,body{background:#222;margin:0;}
+            body{border-top:4px solid #000;}
+            .content{color:#777;font:12px/1.4 "helvetica neue",arial,sans-serif;width:620px;margin:20px auto;}
+            h1{font-size:12px;font-weight:normal;color:#ddd;margin:0;}
+            p{margin:0 0 20px}
+            a {color:#22BCB9;text-decoration:none;}
+            .cred{margin-top:20px;font-size:11px;}
+
+            /* This rule is read by Galleria to define the gallery height: */
+            #galleria{height:320px}
+
+        </style>
+
+        <!-- load jQuery -->
+        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
+
+        <!-- load Galleria -->
+        <script src="../../galleria-1.2.6.min.js"></script>
+
+        <!-- load the History plugin, no need for further scripting -->
+        <script src="galleria.history.min.js"></script>
+
+    </head>
+<body>
+    <div class="content">
+        <h1>Galleria History Plugin</h1>
+        <p>Demonstrating a basic history example. Supports most browsers, including FF 3.0+ and IE 7+</p>
+
+        <!-- Adding gallery images. We use resized thumbnails here for better performance, but it’s not necessary -->
+
+        <div id="galleria">
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Locomotives-Roundhouse2.jpg/800px-Locomotives-Roundhouse2.jpg">
+            	<img title="Locomotives Roundhouse"
+            	     alt="Steam locomotives of the Chicago &amp; North Western Railway."
+            	     src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Locomotives-Roundhouse2.jpg/100px-Locomotives-Roundhouse2.jpg">
+        	</a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/3/36/Icebergs_in_the_High_Arctic_-_20050907.jpg/1000px-Icebergs_in_the_High_Arctic_-_20050907.jpg">
+                <img title="Icebergs in the High Arctic"
+                     alt="”The debris loading isn't particularly extensive, but the color is usual.”"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/36/Icebergs_in_the_High_Arctic_-_20050907.jpg/100px-Icebergs_in_the_High_Arctic_-_20050907.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Ara%C3%B1a._A_Estrada%2C_Galiza._02.jpg/1000px-Ara%C3%B1a._A_Estrada%2C_Galiza._02.jpg">
+                <img title="Araña"
+                     alt="Xysticus cristatus, A Estrada, Galicia, Spain"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Ara%C3%B1a._A_Estrada%2C_Galiza._02.jpg/100px-Ara%C3%B1a._A_Estrada%2C_Galiza._02.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/9104_-_Milano_-_Museo_storia_naturale_-_Fluorite_-_Foto_Giovanni_Dall%27Orto_22-Apr-2007.jpg/1000px-9104_-_Milano_-_Museo_storia_naturale_-_Fluorite_-_Foto_Giovanni_Dall%27Orto_22-Apr-2007.jpg">
+                <img title="Museo storia naturale"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/9104_-_Milano_-_Museo_storia_naturale_-_Fluorite_-_Foto_Giovanni_Dall%27Orto_22-Apr-2007.jpg/100px-9104_-_Milano_-_Museo_storia_naturale_-_Fluorite_-_Foto_Giovanni_Dall%27Orto_22-Apr-2007.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Grj%C3%B3tagj%C3%A1_caves_in_summer_2009_%282%29.jpg/1000px-Grj%C3%B3tagj%C3%A1_caves_in_summer_2009_%282%29.jpg">
+                <img title="Grjótagjá caves in summer 2009"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Grj%C3%B3tagj%C3%A1_caves_in_summer_2009_%282%29.jpg/100px-Grj%C3%B3tagj%C3%A1_caves_in_summer_2009_%282%29.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/9/90/20091128_Loutra_Thermes_Xanthi_Thrace_Greece_2.jpg/1000px-20091128_Loutra_Thermes_Xanthi_Thrace_Greece_2.jpg">
+                <img title="Thermes"
+                     alt="Xanthi hot-spa springs, Xanthi Prefecture, Greece"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/90/20091128_Loutra_Thermes_Xanthi_Thrace_Greece_2.jpg/100px-20091128_Loutra_Thermes_Xanthi_Thrace_Greece_2.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Polish_Army_Ko%C5%82obrzeg_077.JPG/1024px-Polish_Army_Ko%C5%82obrzeg_077.JPG">
+                <img title="Polish Army Kołobrzeg"
+                     alt="A display of the Polish Army. Both the soldier, and the vehicle belong to the 7th Pomeranian Coastal Defence Brigade, a part of the Szczecin-based 12th Mechanized Division ”Bolesław Krzywousty”"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Polish_Army_Ko%C5%82obrzeg_077.JPG/100px-Polish_Army_Ko%C5%82obrzeg_077.JPG">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/20100213_Zlatograd_Bulgaria_3.jpg/1024px-20100213_Zlatograd_Bulgaria_3.jpg">
+                <img title="Zlatograd Bulgaria"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/20100213_Zlatograd_Bulgaria_3.jpg/100px-20100213_Zlatograd_Bulgaria_3.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/FEMA_-_5399_-_Photograph_by_Andrea_Booher_taken_on_09-28-2001_in_New_York.jpg/1024px-FEMA_-_5399_-_Photograph_by_Andrea_Booher_taken_on_09-28-2001_in_New_York.jpg">
+                <img title="09-28-2001 in New York City"
+                     alt="New York, NY, September 28, 2001 -- Debris on surrounding roofs at the site of the World Trade Center. Photo by Andrea Booher/ FEMA News Photo"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/FEMA_-_5399_-_Photograph_by_Andrea_Booher_taken_on_09-28-2001_in_New_York.jpg/100px-FEMA_-_5399_-_Photograph_by_Andrea_Booher_taken_on_09-28-2001_in_New_York.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Antennae%2C_Hubble_images.jpg/1024px-Antennae%2C_Hubble_images.jpg">
+                <img src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Antennae%2C_Hubble_images.jpg/100px-Antennae%2C_Hubble_images.jpg">
+            </a>
+        </div>
+
+        <p class="cred">Made by <a href="http://galleria.aino.se">Galleria</a>.</p>
+    </div>
+
+    <script>
+
+    // Load the classic theme
+	Galleria.loadTheme('../../themes/classic/galleria.classic.min.js');
+
+	// Initialize Galleria
+	$('#galleria').galleria();
+
+    </script>
+    </body>
+</html>
Index: /extensions/stripped_galleria/galleria/themes/classic/classic-demo.html
===================================================================
--- /extensions/stripped_galleria/galleria/themes/classic/classic-demo.html	(revision 12977)
+++ /extensions/stripped_galleria/galleria/themes/classic/classic-demo.html	(revision 12977)
@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <meta charset="utf-8">
+        <title>Galleria Classic Theme</title>
+        <style>
+
+            /* Demo styles */
+            html,body{background:#222;margin:0;}
+            body{border-top:4px solid #000;}
+            .content{color:#777;font:12px/1.4 "helvetica neue",arial,sans-serif;width:620px;margin:20px auto;}
+            h1{font-size:12px;font-weight:normal;color:#ddd;margin:0;}
+            p{margin:0 0 20px}
+            a {color:#22BCB9;text-decoration:none;}
+            .cred{margin-top:20px;font-size:11px;}
+
+            /* This rule is read by Galleria to define the gallery height: */
+            #galleria{height:320px}
+
+        </style>
+
+        <!-- load jQuery -->
+        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script>
+
+        <!-- load Galleria -->
+        <script src="../../galleria-1.2.5.min.js"></script>
+
+    </head>
+<body>
+    <div class="content">
+        <h1>Galleria Classic Theme</h1>
+        <p>Demonstrating a basic gallery example.</p>
+
+        <!-- Adding gallery images. We use resized thumbnails here for better performance, but it’s not necessary -->
+
+        <div id="galleria">
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Locomotives-Roundhouse2.jpg/800px-Locomotives-Roundhouse2.jpg">
+            	<img title="Locomotives Roundhouse"
+            	     alt="Steam locomotives of the Chicago &amp; North Western Railway."
+            	     src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Locomotives-Roundhouse2.jpg/100px-Locomotives-Roundhouse2.jpg">
+        	</a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/3/36/Icebergs_in_the_High_Arctic_-_20050907.jpg/1000px-Icebergs_in_the_High_Arctic_-_20050907.jpg">
+                <img title="Icebergs in the High Arctic"
+                     alt="”The debris loading isn't particularly extensive, but the color is usual.”"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/36/Icebergs_in_the_High_Arctic_-_20050907.jpg/100px-Icebergs_in_the_High_Arctic_-_20050907.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Ara%C3%B1a._A_Estrada%2C_Galiza._02.jpg/1000px-Ara%C3%B1a._A_Estrada%2C_Galiza._02.jpg">
+                <img title="Araña"
+                     alt="Xysticus cristatus, A Estrada, Galicia, Spain"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Ara%C3%B1a._A_Estrada%2C_Galiza._02.jpg/100px-Ara%C3%B1a._A_Estrada%2C_Galiza._02.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/9104_-_Milano_-_Museo_storia_naturale_-_Fluorite_-_Foto_Giovanni_Dall%27Orto_22-Apr-2007.jpg/1000px-9104_-_Milano_-_Museo_storia_naturale_-_Fluorite_-_Foto_Giovanni_Dall%27Orto_22-Apr-2007.jpg">
+                <img title="Museo storia naturale"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/9104_-_Milano_-_Museo_storia_naturale_-_Fluorite_-_Foto_Giovanni_Dall%27Orto_22-Apr-2007.jpg/100px-9104_-_Milano_-_Museo_storia_naturale_-_Fluorite_-_Foto_Giovanni_Dall%27Orto_22-Apr-2007.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Grj%C3%B3tagj%C3%A1_caves_in_summer_2009_%282%29.jpg/1000px-Grj%C3%B3tagj%C3%A1_caves_in_summer_2009_%282%29.jpg">
+                <img title="Grjótagjá caves in summer 2009"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Grj%C3%B3tagj%C3%A1_caves_in_summer_2009_%282%29.jpg/100px-Grj%C3%B3tagj%C3%A1_caves_in_summer_2009_%282%29.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/9/90/20091128_Loutra_Thermes_Xanthi_Thrace_Greece_2.jpg/1000px-20091128_Loutra_Thermes_Xanthi_Thrace_Greece_2.jpg">
+                <img title="Thermes"
+                     alt="Xanthi hot-spa springs, Xanthi Prefecture, Greece"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/90/20091128_Loutra_Thermes_Xanthi_Thrace_Greece_2.jpg/100px-20091128_Loutra_Thermes_Xanthi_Thrace_Greece_2.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Polish_Army_Ko%C5%82obrzeg_077.JPG/1024px-Polish_Army_Ko%C5%82obrzeg_077.JPG">
+                <img title="Polish Army Kołobrzeg"
+                     alt="A display of the Polish Army. Both the soldier, and the vehicle belong to the 7th Pomeranian Coastal Defence Brigade, a part of the Szczecin-based 12th Mechanized Division ”Bolesław Krzywousty”"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Polish_Army_Ko%C5%82obrzeg_077.JPG/100px-Polish_Army_Ko%C5%82obrzeg_077.JPG">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/20100213_Zlatograd_Bulgaria_3.jpg/1024px-20100213_Zlatograd_Bulgaria_3.jpg">
+                <img title="Zlatograd Bulgaria"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/20100213_Zlatograd_Bulgaria_3.jpg/100px-20100213_Zlatograd_Bulgaria_3.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/FEMA_-_5399_-_Photograph_by_Andrea_Booher_taken_on_09-28-2001_in_New_York.jpg/1024px-FEMA_-_5399_-_Photograph_by_Andrea_Booher_taken_on_09-28-2001_in_New_York.jpg">
+                <img title="09-28-2001 in New York City"
+                     alt="New York, NY, September 28, 2001 -- Debris on surrounding roofs at the site of the World Trade Center. Photo by Andrea Booher/ FEMA News Photo"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/FEMA_-_5399_-_Photograph_by_Andrea_Booher_taken_on_09-28-2001_in_New_York.jpg/100px-FEMA_-_5399_-_Photograph_by_Andrea_Booher_taken_on_09-28-2001_in_New_York.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Antennae%2C_Hubble_images.jpg/1024px-Antennae%2C_Hubble_images.jpg">
+                <img src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Antennae%2C_Hubble_images.jpg/100px-Antennae%2C_Hubble_images.jpg">
+            </a>
+        </div>
+
+        <p class="cred">Made by <a href="http://galleria.aino.se">Galleria</a>.</p>
+    </div>
+
+    <script>
+
+    // Load the classic theme
+	Galleria.loadTheme('galleria.classic.min.js');
+
+	// Initialize Galleria
+	$('#galleria').galleria();
+
+    </script>
+    </body>
+</html>
Index: /extensions/stripped_galleria/galleria/themes/classic/galleria.classic.css
===================================================================
--- /extensions/stripped_galleria/galleria/themes/classic/galleria.classic.css	(revision 12977)
+++ /extensions/stripped_galleria/galleria/themes/classic/galleria.classic.css	(revision 12977)
@@ -0,0 +1,222 @@
+/*
+ * Galleria Classic Theme
+ * Copyright (c) 2010, Aino
+ * Licensed under the MIT license.
+ * Modification for stripped-galleria theme for Piwigo
+  */
+ 
+.galleria-container {
+    position: relative;
+    overflow: hidden;
+    background: #000;
+}
+.galleria-container img {
+    -moz-user-select: none;
+    -webkit-user-select: none;
+    -o-user-select: none;
+}
+.galleria-stage {
+    position: absolute;
+    top: 10px;
+    bottom: 60px;
+    left: 10px;
+    right: 10px;
+    overflow:hidden;
+}
+.galleria-thumbnails-container {
+    height: 50px;
+    bottom: 0;
+    position: absolute;
+    left: 10px;
+    right: 10px;
+    z-index: 2;
+}
+.galleria-carousel .galleria-thumbnails-list {
+    margin-left: 30px;
+    margin-right: 30px;
+}
+.galleria-thumbnails .galleria-image {
+    height: 40px;
+    width: 60px;
+    background: #000;
+    margin: 0 5px 0 0;
+    border: 1px solid #000;
+    float: left;
+    cursor: pointer;
+}
+.galleria-counter {
+    position: absolute;
+    bottom: 10px;
+    left: 10px;
+    text-align: right;
+    color: #fff;
+    font: normal 11px/1 arial,sans-serif;
+    z-index: 1;
+}
+.galleria-loader {
+    background: #000;
+    width: 20px;
+    height: 20px;
+    position: absolute;
+    top: 10px;
+    right: 10px;
+    z-index: 2;
+    display: none;
+    background: url(classic-loader.gif) no-repeat 2px 2px;
+}
+.galleria-info {
+    width: 50%;
+    top: 15px;
+    left: 15px;
+    z-index: 2;
+    position: absolute;
+}
+.galleria-info-text {
+    background-color: #050505;
+    padding: 12px;
+    display: none;
+    /* IE7 */ zoom:1;
+	opacity:0.8;
+    filter: alpha(opacity=80);
+}
+.galleria-info-title {
+	line-height:1.1;
+    margin: 0;
+    color: #fff;
+	margin-bottom: 7px;
+}
+.galleria-info-description {
+    font-style: italic;
+	line-height:1.4;
+    margin: 0;
+    color: #fff;
+}
+.galleria-info-close {
+    width: 9px;
+    height: 9px;
+    position: absolute;
+    top: 5px;
+    right: 5px;
+    background-position: -753px -11px;
+    opacity: .5;
+    filter: alpha(opacity=50);
+    cursor: pointer;
+    display: none;
+}
+.notouch .galleria-info-close:hover{
+    opacity:1;
+    filter: alpha(opacity=100);
+}
+.touch .galleria-info-close:active{
+    opacity:1;
+    filter: alpha(opacity=100);
+}
+.galleria-info-link {
+    background-position: -669px -5px;
+    opacity: .7;
+    filter: alpha(opacity=70);
+    position: absolute;
+    width: 20px;
+    height: 20px;
+    cursor: pointer;
+ }
+ .notouch .galleria-info-link:hover {
+    opacity: 1;
+    filter: alpha(opacity=100);
+}
+.touch .galleria-info-link:active {
+    opacity: 1;
+    filter: alpha(opacity=100);
+}
+.galleria-image-nav {
+    position: absolute;
+    top: 50%;
+    margin-top: -62px;
+    width: 100%;
+    height: 62px;
+    left: 0;
+}
+.galleria-image-nav-left,
+.galleria-image-nav-right {
+    opacity: .3;
+    filter: alpha(opacity=30);
+    cursor: pointer;
+    width: 62px;
+    height: 124px;
+    position: absolute;
+    left: 10px;
+    z-index: 2;
+    background-position: 0 46px;
+}
+.galleria-image-nav-right {
+    left: auto;
+    right: 10px;
+    background-position: -254px 46px;
+    z-index: 2;
+}
+.notouch .galleria-image-nav-left:hover,
+.notouch .galleria-image-nav-right:hover {
+    opacity: 1;
+    filter: alpha(opacity=100);
+}
+.touch .galleria-image-nav-left:active,
+.touch .galleria-image-nav-right:active {
+    opacity: 1;
+    filter: alpha(opacity=100);
+}
+.galleria-thumb-nav-left,
+.galleria-thumb-nav-right {
+    cursor: pointer;
+    display: none;
+    background-position: -495px 5px;
+    position: absolute;
+    left: 0;
+    top: 0;
+    height: 40px;
+    width: 23px;
+    z-index: 3;
+    opacity: .8;
+    filter: alpha(opacity=80);
+}
+.galleria-thumb-nav-right {
+    background-position: -578px 5px;
+    border-right: none;
+    right: 0;
+    left: auto;
+}
+.galleria-thumbnails-container .disabled {
+    opacity: .2;
+    filter: alpha(opacity=20);
+    cursor: default;
+}
+.notouch .galleria-thumb-nav-left:hover,
+.notouch .galleria-thumb-nav-right:hover {
+    opacity: 1;
+    filter: alpha(opacity=100);
+    background-color: #111;
+}
+.touch .galleria-thumb-nav-left:active,
+.touch .galleria-thumb-nav-right:active {
+    opacity: 1;
+    filter: alpha(opacity=100);
+    background-color: #111;
+}
+.notouch .galleria-thumbnails-container .disabled:hover {
+    opacity: .2;
+    filter: alpha(opacity=20);
+    background-color: transparent;
+}
+
+.galleria-carousel .galleria-thumb-nav-left,
+.galleria-carousel .galleria-thumb-nav-right {
+    display: block;
+}
+.galleria-thumb-nav-left,
+.galleria-thumb-nav-right,
+.galleria-info-link,
+.galleria-info-close,
+.galleria-image-nav-left,
+.galleria-image-nav-right {
+    background-image: url(classic-map.png);
+    background-repeat: no-repeat;
+}
Index: /extensions/stripped_galleria/galleria/themes/classic/galleria.classic.js
===================================================================
--- /extensions/stripped_galleria/galleria/themes/classic/galleria.classic.js	(revision 12977)
+++ /extensions/stripped_galleria/galleria/themes/classic/galleria.classic.js	(revision 12977)
@@ -0,0 +1,94 @@
+/**
+ * @preserve Galleria Classic Theme 2011-08-01
+ * http://galleria.aino.se
+ *
+ * Copyright (c) 2011, Aino
+ * Licensed under the MIT license.
+ */
+
+/*global jQuery, Galleria */
+
+Galleria.requires(1.25, 'This version of Classic theme requires Galleria 1.2.5 or later');
+
+(function($) {
+
+Galleria.addTheme({
+    name: 'classic',
+    author: 'Galleria',
+    css: 'galleria.classic.css',
+    defaults: {
+        transition: 'slide',
+        thumbCrop:  'height',
+
+        // set this to false if you want to show the caption all the time:
+        _toggleInfo: true
+    },
+    init: function(options) {
+
+        // add some elements
+        this.addElement('info-link','info-close');
+        this.append({
+            'info' : ['info-link','info-close']
+        });
+
+        // cache some stuff
+        var info = this.$('info-link,info-close,info-text'),
+            touch = Galleria.TOUCH,
+            click = touch ? 'touchstart' : 'click';
+
+        // show loader & counter with opacity
+        this.$('loader,counter').show().css('opacity', 0.4);
+
+        // some stuff for non-touch browsers
+        if (! touch ) {
+            this.addIdleState( this.get('image-nav-left'), { left:-50 });
+            this.addIdleState( this.get('image-nav-right'), { right:-50 });
+            this.addIdleState( this.get('counter'), { opacity:0 });
+        }
+
+        // toggle info
+        if ( options._toggleInfo === true ) {
+            info.bind( click, function() {
+                info.toggle();
+            });
+        } else {
+            info.show();
+            this.$('info-link, info-close').hide();
+        }
+
+        // bind some stuff
+        this.bind('thumbnail', function(e) {
+
+            if (! touch ) {
+                // fade thumbnails
+                $(e.thumbTarget).css('opacity', 0.6).parent().hover(function() {
+                    $(this).not('.active').children().stop().fadeTo(100, 1);
+                }, function() {
+                    $(this).not('.active').children().stop().fadeTo(400, 0.6);
+                });
+
+                if ( e.index === this.getIndex() ) {
+                    $(e.thumbTarget).css('opacity',1);
+                }
+            } else {
+                $(e.thumbTarget).css('opacity', this.getIndex() ? 1 : 0.6);
+            }
+        });
+
+        this.bind('loadstart', function(e) {
+            if (!e.cached) {
+                this.$('loader').show().fadeTo(200, 0.4);
+            }
+
+            this.$('info').toggle( this.hasInfo() );
+
+            $(e.thumbTarget).css('opacity',1).parent().siblings().children().css('opacity', 0.6);
+        });
+
+        this.bind('loadfinish', function(e) {
+            this.$('loader').fadeOut(200);
+        });
+    }
+});
+
+}(jQuery));
Index: /extensions/stripped_galleria/galleria/themes/classic/galleria.classic.min.js
===================================================================
--- /extensions/stripped_galleria/galleria/themes/classic/galleria.classic.min.js	(revision 12977)
+++ /extensions/stripped_galleria/galleria/themes/classic/galleria.classic.min.js	(revision 12977)
@@ -0,0 +1,11 @@
+/*
+ Galleria Classic Theme 2011-08-01
+ http://galleria.aino.se
+
+ Copyright (c) 2011, Aino
+ Licensed under the MIT license.
+*/
+Galleria.requires(1.25,"This version of Classic theme requires Galleria 1.2.5 or later");
+(function(b){Galleria.addTheme({name:"classic",author:"Galleria",css:"galleria.classic.css",defaults:{transition:"slide",thumbCrop:"height",_toggleInfo:!0},init:function(e){this.addElement("info-link","info-close");this.append({info:["info-link","info-close"]});var c=this.$("info-link,info-close,info-text"),d=Galleria.TOUCH,f=d?"touchstart":"click";this.$("loader,counter").show().css("opacity",0.4);d||(this.addIdleState(this.get("image-nav-left"),{left:-50}),this.addIdleState(this.get("image-nav-right"),
+{right:-50}),this.addIdleState(this.get("counter"),{opacity:0}));e._toggleInfo===!0?c.bind(f,function(){c.toggle()}):(c.show(),this.$("info-link, info-close").hide());this.bind("thumbnail",function(a){d?b(a.thumbTarget).css("opacity",this.getIndex()?1:0.6):(b(a.thumbTarget).css("opacity",0.6).parent().hover(function(){b(this).not(".active").children().stop().fadeTo(100,1)},function(){b(this).not(".active").children().stop().fadeTo(400,0.6)}),a.index===this.getIndex()&&b(a.thumbTarget).css("opacity",
+1))});this.bind("loadstart",function(a){a.cached||this.$("loader").show().fadeTo(200,0.4);this.$("info").toggle(this.hasInfo());b(a.thumbTarget).css("opacity",1).parent().siblings().children().css("opacity",0.6)});this.bind("loadfinish",function(){this.$("loader").fadeOut(200)})}})})(jQuery);
Index: /extensions/stripped_galleria/galleria/themes/classicwhite/classic-demo.html
===================================================================
--- /extensions/stripped_galleria/galleria/themes/classicwhite/classic-demo.html	(revision 12977)
+++ /extensions/stripped_galleria/galleria/themes/classicwhite/classic-demo.html	(revision 12977)
@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <meta charset="utf-8">
+        <title>Galleria Classic Theme</title>
+        <style>
+
+            /* Demo styles */
+            html,body{background:#222;margin:0;}
+            body{border-top:4px solid #000;}
+            .content{color:#777;font:12px/1.4 "helvetica neue",arial,sans-serif;width:620px;margin:20px auto;}
+            h1{font-size:12px;font-weight:normal;color:#ddd;margin:0;}
+            p{margin:0 0 20px}
+            a {color:#22BCB9;text-decoration:none;}
+            .cred{margin-top:20px;font-size:11px;}
+
+            /* This rule is read by Galleria to define the gallery height: */
+            #galleria{height:320px}
+
+        </style>
+
+        <!-- load jQuery -->
+        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script>
+
+        <!-- load Galleria -->
+        <script src="../../galleria-1.2.5.min.js"></script>
+
+    </head>
+<body>
+    <div class="content">
+        <h1>Galleria Classic Theme</h1>
+        <p>Demonstrating a basic gallery example.</p>
+
+        <!-- Adding gallery images. We use resized thumbnails here for better performance, but it’s not necessary -->
+
+        <div id="galleria">
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Locomotives-Roundhouse2.jpg/800px-Locomotives-Roundhouse2.jpg">
+            	<img title="Locomotives Roundhouse"
+            	     alt="Steam locomotives of the Chicago &amp; North Western Railway."
+            	     src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Locomotives-Roundhouse2.jpg/100px-Locomotives-Roundhouse2.jpg">
+        	</a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/3/36/Icebergs_in_the_High_Arctic_-_20050907.jpg/1000px-Icebergs_in_the_High_Arctic_-_20050907.jpg">
+                <img title="Icebergs in the High Arctic"
+                     alt="”The debris loading isn't particularly extensive, but the color is usual.”"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/36/Icebergs_in_the_High_Arctic_-_20050907.jpg/100px-Icebergs_in_the_High_Arctic_-_20050907.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Ara%C3%B1a._A_Estrada%2C_Galiza._02.jpg/1000px-Ara%C3%B1a._A_Estrada%2C_Galiza._02.jpg">
+                <img title="Araña"
+                     alt="Xysticus cristatus, A Estrada, Galicia, Spain"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Ara%C3%B1a._A_Estrada%2C_Galiza._02.jpg/100px-Ara%C3%B1a._A_Estrada%2C_Galiza._02.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/9104_-_Milano_-_Museo_storia_naturale_-_Fluorite_-_Foto_Giovanni_Dall%27Orto_22-Apr-2007.jpg/1000px-9104_-_Milano_-_Museo_storia_naturale_-_Fluorite_-_Foto_Giovanni_Dall%27Orto_22-Apr-2007.jpg">
+                <img title="Museo storia naturale"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/9104_-_Milano_-_Museo_storia_naturale_-_Fluorite_-_Foto_Giovanni_Dall%27Orto_22-Apr-2007.jpg/100px-9104_-_Milano_-_Museo_storia_naturale_-_Fluorite_-_Foto_Giovanni_Dall%27Orto_22-Apr-2007.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Grj%C3%B3tagj%C3%A1_caves_in_summer_2009_%282%29.jpg/1000px-Grj%C3%B3tagj%C3%A1_caves_in_summer_2009_%282%29.jpg">
+                <img title="Grjótagjá caves in summer 2009"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Grj%C3%B3tagj%C3%A1_caves_in_summer_2009_%282%29.jpg/100px-Grj%C3%B3tagj%C3%A1_caves_in_summer_2009_%282%29.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/9/90/20091128_Loutra_Thermes_Xanthi_Thrace_Greece_2.jpg/1000px-20091128_Loutra_Thermes_Xanthi_Thrace_Greece_2.jpg">
+                <img title="Thermes"
+                     alt="Xanthi hot-spa springs, Xanthi Prefecture, Greece"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/90/20091128_Loutra_Thermes_Xanthi_Thrace_Greece_2.jpg/100px-20091128_Loutra_Thermes_Xanthi_Thrace_Greece_2.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Polish_Army_Ko%C5%82obrzeg_077.JPG/1024px-Polish_Army_Ko%C5%82obrzeg_077.JPG">
+                <img title="Polish Army Kołobrzeg"
+                     alt="A display of the Polish Army. Both the soldier, and the vehicle belong to the 7th Pomeranian Coastal Defence Brigade, a part of the Szczecin-based 12th Mechanized Division ”Bolesław Krzywousty”"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Polish_Army_Ko%C5%82obrzeg_077.JPG/100px-Polish_Army_Ko%C5%82obrzeg_077.JPG">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/20100213_Zlatograd_Bulgaria_3.jpg/1024px-20100213_Zlatograd_Bulgaria_3.jpg">
+                <img title="Zlatograd Bulgaria"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/20100213_Zlatograd_Bulgaria_3.jpg/100px-20100213_Zlatograd_Bulgaria_3.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/FEMA_-_5399_-_Photograph_by_Andrea_Booher_taken_on_09-28-2001_in_New_York.jpg/1024px-FEMA_-_5399_-_Photograph_by_Andrea_Booher_taken_on_09-28-2001_in_New_York.jpg">
+                <img title="09-28-2001 in New York City"
+                     alt="New York, NY, September 28, 2001 -- Debris on surrounding roofs at the site of the World Trade Center. Photo by Andrea Booher/ FEMA News Photo"
+                     src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/FEMA_-_5399_-_Photograph_by_Andrea_Booher_taken_on_09-28-2001_in_New_York.jpg/100px-FEMA_-_5399_-_Photograph_by_Andrea_Booher_taken_on_09-28-2001_in_New_York.jpg">
+            </a>
+            <a href="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Antennae%2C_Hubble_images.jpg/1024px-Antennae%2C_Hubble_images.jpg">
+                <img src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Antennae%2C_Hubble_images.jpg/100px-Antennae%2C_Hubble_images.jpg">
+            </a>
+        </div>
+
+        <p class="cred">Made by <a href="http://galleria.aino.se">Galleria</a>.</p>
+    </div>
+
+    <script>
+
+    // Load the classic theme
+	Galleria.loadTheme('galleria.classic.min.js');
+
+	// Initialize Galleria
+	$('#galleria').galleria();
+
+    </script>
+    </body>
+</html>
Index: /extensions/stripped_galleria/galleria/themes/classicwhite/galleria.classic.css
===================================================================
--- /extensions/stripped_galleria/galleria/themes/classicwhite/galleria.classic.css	(revision 12977)
+++ /extensions/stripped_galleria/galleria/themes/classicwhite/galleria.classic.css	(revision 12977)
@@ -0,0 +1,223 @@
+/*
+ * Galleria Classic Theme
+ * Copyright (c) 2010, Aino
+ * Licensed under the MIT license.
+ * Modification for stripped-galleria theme for Piwigo
+ */
+ 
+.galleria-container {
+    position: relative;
+    overflow: hidden;
+    background: #fff;
+}
+.galleria-container img {
+    -moz-user-select: none;
+    -webkit-user-select: none;
+    -o-user-select: none;
+}
+.galleria-stage {
+    position: absolute;
+    top: 10px;
+    bottom: 60px;
+    left: 10px;
+    right: 10px;
+    overflow:hidden;
+}
+.galleria-thumbnails-container {
+    height: 50px;
+    bottom: 0;
+    position: absolute;
+    left: 10px;
+    right: 10px;
+    z-index: 2;
+}
+.galleria-carousel .galleria-thumbnails-list {
+    margin-left: 30px;
+    margin-right: 30px;
+}
+.galleria-thumbnails .galleria-image {
+    height: 40px;
+    width: 60px;
+    background: #fff;
+    margin: 0 5px 0 0;
+    border: 1px solid #fff;
+    float: left;
+    cursor: pointer;
+}
+.galleria-counter {
+    position: absolute;
+    bottom: 10px;
+    left: 10px;
+    text-align: right;
+    color: #000;
+    font: normal 11px/1 arial,sans-serif;
+    z-index: 1;
+}
+.galleria-loader {
+    background: #fff;
+    width: 20px;
+    height: 20px;
+    position: absolute;
+    top: 10px;
+    right: 10px;
+    z-index: 2;
+    display: none;
+    background: url(classic-loader.gif) no-repeat 2px 2px;
+}
+.galleria-info {
+    width: 50%;
+    top: 15px;
+    left: 15px;
+    z-index: 2;
+    position: absolute;
+}
+.galleria-info-text {
+    background-color: #fbfbfb;
+    padding: 12px;
+    display: none;
+    /* IE7 */ zoom:1;
+	opacity:0.7;
+    filter: alpha(opacity=70);
+}
+.galleria-info-title {
+	line-height:1.1;
+    margin: 0;
+    color: #000;
+	margin-bottom: 7px;
+}
+.galleria-info-description {
+    font-style: italic;
+	line-height:1.4;
+    margin: 0;
+    color: #000;
+}
+.galleria-info-close {
+    width: 9px;
+    height: 9px;
+    position: absolute;
+    top: 5px;
+    right: 5px;
+    background-position: -753px -11px;
+    opacity: .5;
+    filter: alpha(opacity=50);
+    cursor: pointer;
+    display: none;
+}
+.notouch .galleria-info-close:hover{
+    opacity:1;
+    filter: alpha(opacity=100);
+}
+.touch .galleria-info-close:active{
+    opacity:1;
+    filter: alpha(opacity=100);
+}
+.galleria-info-link {
+    background-position: -669px -5px;
+    opacity: .7;
+    filter: alpha(opacity=70);
+    position: absolute;
+    width: 20px;
+    height: 20px;
+    cursor: pointer;
+    background-color: #fff;
+}
+.notouch .galleria-info-link:hover {
+    opacity: 1;
+    filter: alpha(opacity=100);
+}
+.touch .galleria-info-link:active {
+    opacity: 1;
+    filter: alpha(opacity=100);
+}
+.galleria-image-nav {
+    position: absolute;
+    top: 50%;
+    margin-top: -62px;
+    width: 100%;
+    height: 62px;
+    left: 0;
+}
+.galleria-image-nav-left,
+.galleria-image-nav-right {
+    opacity: .3;
+    filter: alpha(opacity=30);
+    cursor: pointer;
+    width: 62px;
+    height: 124px;
+    position: absolute;
+    left: 10px;
+    z-index: 2;
+    background-position: 0 46px;
+}
+.galleria-image-nav-right {
+    left: auto;
+    right: 10px;
+    background-position: -254px 46px;
+    z-index: 2;
+}
+.notouch .galleria-image-nav-left:hover,
+.notouch .galleria-image-nav-right:hover {
+    opacity: 1;
+    filter: alpha(opacity=100);
+}
+.touch .galleria-image-nav-left:active,
+.touch .galleria-image-nav-right:active {
+    opacity: 1;
+    filter: alpha(opacity=100);
+}
+.galleria-thumb-nav-left,
+.galleria-thumb-nav-right {
+    cursor: pointer;
+    display: none;
+    background-position: -495px 5px;
+    position: absolute;
+    left: 0;
+    top: 0;
+    height: 40px;
+    width: 23px;
+    z-index: 3;
+    opacity: .8;
+    filter: alpha(opacity=80);
+}
+.galleria-thumb-nav-right {
+    background-position: -578px 5px;
+    border-right: none;
+    right: 0;
+    left: auto;
+}
+.galleria-thumbnails-container .disabled {
+    opacity: .2;
+    filter: alpha(opacity=20);
+    cursor: default;
+}
+.notouch .galleria-thumb-nav-left:hover,
+.notouch .galleria-thumb-nav-right:hover {
+    opacity: 1;
+    filter: alpha(opacity=100);
+    background-color: #eee;
+}
+.touch .galleria-thumb-nav-left:active,
+.touch .galleria-thumb-nav-right:active {
+    opacity: 1;
+    filter: alpha(opacity=100);
+    background-color: #eee;
+}
+.notouch .galleria-thumbnails-container .disabled:hover {
+    opacity: .2;
+    filter: alpha(opacity=20);
+    background-color: transparent;
+}
+
+.galleria-carousel .galleria-thumb-nav-left,
+.galleria-carousel .galleria-thumb-nav-right {
+    display: block;
+}
+.galleria-thumb-nav-left,
+.galleria-thumb-nav-right,
+.galleria-info-link,
+.galleria-info-close,
+.galleria-image-nav-left,
+.galleria-image-nav-right {
+    background-image: url(classic-map.png);
+    background-repeat: no-repeat;
+}
Index: /extensions/stripped_galleria/galleria/themes/classicwhite/galleria.classic.js
===================================================================
--- /extensions/stripped_galleria/galleria/themes/classicwhite/galleria.classic.js	(revision 12977)
+++ /extensions/stripped_galleria/galleria/themes/classicwhite/galleria.classic.js	(revision 12977)
@@ -0,0 +1,94 @@
+/**
+ * @preserve Galleria Classic Theme 2011-08-01
+ * http://galleria.aino.se
+ *
+ * Copyright (c) 2011, Aino
+ * Licensed under the MIT license.
+ */
+
+/*global jQuery, Galleria */
+
+Galleria.requires(1.25, 'This version of Classic theme requires Galleria 1.2.5 or later');
+
+(function($) {
+
+Galleria.addTheme({
+    name: 'classic',
+    author: 'Galleria',
+    css: 'galleria.classic.css',
+    defaults: {
+        transition: 'slide',
+        thumbCrop:  'height',
+
+        // set this to false if you want to show the caption all the time:
+        _toggleInfo: true
+    },
+    init: function(options) {
+
+        // add some elements
+        this.addElement('info-link','info-close');
+        this.append({
+            'info' : ['info-link','info-close']
+        });
+
+        // cache some stuff
+        var info = this.$('info-link,info-close,info-text'),
+            touch = Galleria.TOUCH,
+            click = touch ? 'touchstart' : 'click';
+
+        // show loader & counter with opacity
+        this.$('loader,counter').show().css('opacity', 0.4);
+
+        // some stuff for non-touch browsers
+        if (! touch ) {
+            this.addIdleState( this.get('image-nav-left'), { left:-50 });
+            this.addIdleState( this.get('image-nav-right'), { right:-50 });
+            this.addIdleState( this.get('counter'), { opacity:0 });
+        }
+
+        // toggle info
+        if ( options._toggleInfo === true ) {
+            info.bind( click, function() {
+                info.toggle();
+            });
+        } else {
+            info.show();
+            this.$('info-link, info-close').hide();
+        }
+
+        // bind some stuff
+        this.bind('thumbnail', function(e) {
+
+            if (! touch ) {
+                // fade thumbnails
+                $(e.thumbTarget).css('opacity', 0.6).parent().hover(function() {
+                    $(this).not('.active').children().stop().fadeTo(100, 1);
+                }, function() {
+                    $(this).not('.active').children().stop().fadeTo(400, 0.6);
+                });
+
+                if ( e.index === this.getIndex() ) {
+                    $(e.thumbTarget).css('opacity',1);
+                }
+            } else {
+                $(e.thumbTarget).css('opacity', this.getIndex() ? 1 : 0.6);
+            }
+        });
+
+        this.bind('loadstart', function(e) {
+            if (!e.cached) {
+                this.$('loader').show().fadeTo(200, 0.4);
+            }
+
+            this.$('info').toggle( this.hasInfo() );
+
+            $(e.thumbTarget).css('opacity',1).parent().siblings().children().css('opacity', 0.6);
+        });
+
+        this.bind('loadfinish', function(e) {
+            this.$('loader').fadeOut(200);
+        });
+    }
+});
+
+}(jQuery));
Index: /extensions/stripped_galleria/galleria/themes/classicwhite/galleria.classic.min.js
===================================================================
--- /extensions/stripped_galleria/galleria/themes/classicwhite/galleria.classic.min.js	(revision 12977)
+++ /extensions/stripped_galleria/galleria/themes/classicwhite/galleria.classic.min.js	(revision 12977)
@@ -0,0 +1,11 @@
+/*
+ Galleria Classic Theme 2011-08-01
+ http://galleria.aino.se
+
+ Copyright (c) 2011, Aino
+ Licensed under the MIT license.
+*/
+Galleria.requires(1.25,"This version of Classic theme requires Galleria 1.2.5 or later");
+(function(b){Galleria.addTheme({name:"classic",author:"Galleria",css:"galleria.classic.css",defaults:{transition:"slide",thumbCrop:"height",_toggleInfo:!0},init:function(e){this.addElement("info-link","info-close");this.append({info:["info-link","info-close"]});var c=this.$("info-link,info-close,info-text"),d=Galleria.TOUCH,f=d?"touchstart":"click";this.$("loader,counter").show().css("opacity",0.4);d||(this.addIdleState(this.get("image-nav-left"),{left:-50}),this.addIdleState(this.get("image-nav-right"),
+{right:-50}),this.addIdleState(this.get("counter"),{opacity:0}));e._toggleInfo===!0?c.bind(f,function(){c.toggle()}):(c.show(),this.$("info-link, info-close").hide());this.bind("thumbnail",function(a){d?b(a.thumbTarget).css("opacity",this.getIndex()?1:0.6):(b(a.thumbTarget).css("opacity",0.6).parent().hover(function(){b(this).not(".active").children().stop().fadeTo(100,1)},function(){b(this).not(".active").children().stop().fadeTo(400,0.6)}),a.index===this.getIndex()&&b(a.thumbTarget).css("opacity",
+1))});this.bind("loadstart",function(a){a.cached||this.$("loader").show().fadeTo(200,0.4);this.$("info").toggle(this.hasInfo());b(a.thumbTarget).css("opacity",1).parent().siblings().children().css("opacity",0.6)});this.bind("loadfinish",function(){this.$("loader").fadeOut(200)})}})})(jQuery);
Index: /extensions/stripped_galleria/index.php
===================================================================
--- /extensions/stripped_galleria/index.php	(revision 12977)
+++ /extensions/stripped_galleria/index.php	(revision 12977)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2011 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/stripped_galleria/language/en_UK/index.php
===================================================================
--- /extensions/stripped_galleria/language/en_UK/index.php	(revision 12977)
+++ /extensions/stripped_galleria/language/en_UK/index.php	(revision 12977)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008      Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/stripped_galleria/language/en_UK/theme.lang.php
===================================================================
--- /extensions/stripped_galleria/language/en_UK/theme.lang.php	(revision 12977)
+++ /extensions/stripped_galleria/language/en_UK/theme.lang.php	(revision 12977)
@@ -0,0 +1,10 @@
+<?php
+$lang['Galleria script options'] = 'Galleria options';
+$lang['Click on image action']='Click on image action';
+$lang['do nothing']='do nothing';
+$lang['display next picture']='display next picture';
+$lang['opens image in a lightbox']='opens image in a lightbox';
+$lang['opens HD image in a lightbox']='opens HD image in a lightbox';
+$lang['Click on image to display next'] = 'Click on image to display next';
+$lang['Transition function']= 'Transition function';
+?>
Index: /extensions/stripped_galleria/language/fr_FR/index.php
===================================================================
--- /extensions/stripped_galleria/language/fr_FR/index.php	(revision 12977)
+++ /extensions/stripped_galleria/language/fr_FR/index.php	(revision 12977)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008      Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/stripped_galleria/language/fr_FR/theme.lang.php
===================================================================
--- /extensions/stripped_galleria/language/fr_FR/theme.lang.php	(revision 12977)
+++ /extensions/stripped_galleria/language/fr_FR/theme.lang.php	(revision 12977)
@@ -0,0 +1,10 @@
+<?php
+$lang['Galleria script options'] = 'Options du script Galleria';
+$lang['Click on image action']='Action du clic sur l\'image';
+$lang['do nothing']='aucune action';
+$lang['display next picture']='affiche l\'image suivante';
+$lang['opens image in a lightbox']='ouvre l\'image dans une lightbox';
+$lang['opens HD image in a lightbox']='ouvre l\'image HD dans une lightbox';
+$lang['Click on image to display next'] = 'Cliquer sur l\'image pour afficher la suivante';
+$lang['Transition function']= 'Fonction de transition';
+?>
Index: /extensions/stripped_galleria/language/index.php
===================================================================
--- /extensions/stripped_galleria/language/index.php	(revision 12977)
+++ /extensions/stripped_galleria/language/index.php	(revision 12977)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008      Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/stripped_galleria/local_head.tpl
===================================================================
--- /extensions/stripped_galleria/local_head.tpl	(revision 12977)
+++ /extensions/stripped_galleria/local_head.tpl	(revision 12977)
@@ -0,0 +1,16 @@
+{php}
+	global $template, $stripped;
+	$template->assign( 'stripped', $stripped );
+{/php}
+
+<!--[if lt IE 7]>{include file='ie6.tpl'}<![endif]-->
+
+{if ($BODY_ID=='theCategoryPage')}
+	{combine_script id='galleriaScript' require='jquery' load='header' path='themes/stripped-galleria/galleria/galleria-1.2.6.min.js'}
+	{combine_script id='galleriaHistoryScript' require='jquery,galleriaScript' load='header' path='themes/stripped-galleria/galleria/plugins/history/galleria.history.min.js'}
+	{if ($stripped.themeStyle == 'white')}
+		{combine_script id='galleriaTheme' require='galleriaScript' load='footer' path='themes/stripped-galleria/galleria/themes/classicwhite/galleria.classic.min.js'}
+	{else}
+		{combine_script id='galleriaTheme' require='galleriaScript' load='footer' path='themes/stripped-galleria/galleria/themes/classic/galleria.classic.min.js'}
+	{/if}
+{/if}
Index: /extensions/stripped_galleria/readme.txt
===================================================================
--- /extensions/stripped_galleria/readme.txt	(revision 12977)
+++ /extensions/stripped_galleria/readme.txt	(revision 12977)
@@ -0,0 +1,35 @@
+stripped-galleria theme for Piwigo
+-------------------------------------------------------------------------------
+Author : Julien Capitaine (Zaphod on Piwigo forums)
+
+stripped-galleria is based on stripped theme and needs stripped 2.x.
+
+It uses the galleria script: http://galleria.aino.se/ and its "classic" theme, both released under the MIT licence.
+The thumbnail page is removed, the script is launched when entering an album.
+A thumbnail carousel is displayed at the bottom of the page.
+
+Several options are available on the configuration page.
+
+Changelog
+---------
+
+*** version 1.2.0
+- galleria script udated: 1.2.6
+- history plugin used 
+- new lightbox option in the theme configuration page
+
+
+*** version 1.1.0
+- compatibility with stripped 2.1.0
+
+
+*** version 1.0.2
+- bug fix
+
+
+*** version 1.0.1
+- bug fix
+
+
+*** version 1.0.0
+- first version
Index: /extensions/stripped_galleria/template/footer.tpl
===================================================================
--- /extensions/stripped_galleria/template/footer.tpl	(revision 12977)
+++ /extensions/stripped_galleria/template/footer.tpl	(revision 12977)
@@ -0,0 +1,79 @@
+<div id="footer">
+	<div id="footer_left">
+		
+		<a name="EoP"></a> <!-- End of Page -->
+		
+		{if isset($USERNAME)}
+			<div class="footer_login">
+				{if isset($U_PROFILE)}
+					 <div class="footer_customize">
+						[<a href="{$U_PROFILE}" title="{'customize the appareance of the gallery'|@translate}">{$USERNAME}</a>]&nbsp;
+					</div>
+				{else}
+					[{$USERNAME}]&nbsp;
+				{/if}
+			</div>
+		{/if}
+
+		{if isset($U_LOGIN)}
+			<a href="{$U_LOGIN}" rel="nofollow">{'Login'|@translate}</a>
+		{/if}
+
+		{if (isset($U_LOGIN) && isset($U_REGISTER))}-{/if}
+		
+		{if isset($U_REGISTER)}
+			<a href="{$U_REGISTER}" title="{'Create a new account'|@translate}" rel="nofollow">{'Register'|@translate}</a>
+		{/if}
+
+		{if isset($U_LOGOUT)}
+			<a href="{$U_LOGOUT}">{'Logout'|@translate}</a>
+		{/if}
+
+		{if (isset($U_LOGOUT) && isset($U_ADMIN))}-{/if}
+
+		{if isset($U_ADMIN)}
+			<a href="{$U_ADMIN}" title="{'available for administrators only'|@translate}">{'Administration'|@translate}</a>
+		{/if}
+
+	</div>
+
+{get_combined_scripts load='footer'}
+
+	{if isset($footer_elements)}
+	{foreach from=$footer_elements item=v}
+	{$v}
+	{/foreach}
+	{/if}
+	
+	<div id="copyright">
+	 {* Please, do not remove this copyright. If you really want to,
+		  contact us on http://piwigo.org to find a solution on how
+		  to show the origin of the script...
+	  *}
+
+	  {'Powered by'|@translate}
+	  <a href="{$PHPWG_URL}" class="Piwigo">
+	  <span class="Piwigo">Piwigo</span></a>
+	  {$VERSION}
+
+	  {if isset($CONTACT_MAIL)}
+	  {'Contact'|@translate}
+	  <a href="mailto:{$CONTACT_MAIL}?subject={'A comment on your site'|@translate|@escape:url}">- {'Webmaster'|@translate} </a>
+	  {/if}
+
+	  {if isset($debug.TIME) }
+	 - {'Page generated in'|@translate} {$debug.TIME} ({$debug.NB_QUERIES} {'SQL queries in'|@translate} {$debug.SQL_TIME})
+	 {/if}
+
+
+	</div>
+</div>
+</div><!-- the_page -->
+{if empty($CATEGORIES) &! empty($THUMBNAILS) }</div>{/if}
+{if isset($debug.QUERIES_LIST)}
+<div id="debug">
+{$debug.QUERIES_LIST}
+</div>
+{/if}
+</body>
+</html>
Index: /extensions/stripped_galleria/template/header.tpl
===================================================================
--- /extensions/stripped_galleria/template/header.tpl	(revision 12977)
+++ /extensions/stripped_galleria/template/header.tpl	(revision 12977)
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html lang="{$lang_info.code}" dir="{$lang_info.direction}">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset={$CONTENT_ENCODING}">
+<meta name="generator" content="Piwigo (aka PWG), see piwigo.org">
+{if isset($meta_ref) } 
+{if isset($INFO_AUTHOR)}
+<meta name="author" content="{$INFO_AUTHOR|@strip_tags:false|@replace:'"':' '}">
+{/if}
+{if isset($related_tags)}
+<meta name="keywords" content="{foreach from=$related_tags item=tag name=tag_loop}{if !$smarty.foreach.tag_loop.first}, {/if}{$tag.name}{/foreach}">
+{/if}
+{if isset($COMMENT_IMG)}
+<meta name="description" content="{$COMMENT_IMG|@strip_tags:false|@replace:'"':' '}{if isset($INFO_FILE)} - {$INFO_FILE}{/if}">
+{else}
+<meta name="description" content="{$PAGE_TITLE}{if isset($INFO_FILE)} - {$INFO_FILE}{/if}">
+{/if}
+{/if}
+
+{if (isset($REVERSE) and $REVERSE and $PAGE_TITLE == l10n('Home'))}
+<title>{$GALLERY_TITLE} | {$PAGE_TITLE}</title>{else}
+<title>{$PAGE_TITLE} | {$GALLERY_TITLE}</title>{/if}
+<link rel="shortcut icon" type="image/x-icon" href="{$ROOT_URL}{$themeconf.icon_dir}/favicon.ico">
+
+<link rel="start" title="{'Home'|@translate}" href="{$U_HOME}" >
+<link rel="search" title="{'Search'|@translate}" href="{$ROOT_URL}search.php" >
+{if isset($first.U_IMG)   }<link rel="first" title="{'First'|@translate}" href="{$first.U_IMG}" >{/if}
+{if isset($previous.U_IMG)}<link rel="prev" title="{'Previous'|@translate}" href="{$previous.U_IMG}" >{/if}
+{if isset($next.U_IMG)    }<link rel="next" title="{'Next'|@translate}" href="{$next.U_IMG}" >{/if}
+{if isset($last.U_IMG)    }<link rel="last" title="{'Last'|@translate}" href="{$last.U_IMG}" >{/if}
+{if isset($U_UP)          }<link rel="up" title="{'Thumbnails'|@translate}" href="{$U_UP}" >{/if}
+
+{get_combined_css}
+{foreach from=$themes item=theme}
+{if $theme.load_css}
+{combine_css path="themes/`$theme.id`/theme.css" order=-10}
+{/if}
+{if !empty($theme.local_head)}{include file=$theme.local_head load_css=$theme.load_css}{/if}
+{/foreach}
+
+
+{if isset($U_PREFETCH)          }<link rel="prefetch" href="{$U_PREFETCH}">{/if}
+
+{if not empty($page_refresh)    }<meta http-equiv="refresh" content="{$page_refresh.TIME};url={$page_refresh.U_REFRESH}">{/if}
+
+{get_combined_scripts load='header'}
+<!--[if lt IE 7]>
+<script type="text/javascript" src="{$ROOT_URL}themes/default/js/pngfix.js"></script>
+<![endif]-->
+
+{if not empty($head_elements)}
+	{foreach from=$head_elements item=elt}{$elt}
+	{/foreach}
+{/if}
+
+</head>
+
+<body id="{$BODY_ID}" class={strip}"
+	{if !$stripped.thumbFrame} ntf{/if}
+	{if !$stripped.albumFrame} naf{/if}
+	{if ($stripped.albumType == 'small')} ats{else} atd{/if}
+	{if ($stripped.albumType == '1perline')} at1{/if}
+	{if ($stripped.albumType == '2perline')} at2{/if}
+	{if ($stripped.albumType == '3perline')} at3{/if}
+"{/strip}>
+
+{if empty($CATEGORIES) &! empty($THUMBNAILS) }<div id="galleria_page">{/if}
+<div id="the_page">
+
+{if not empty($header_msgs)}
+<div class="header_msgs">
+	{foreach from=$header_msgs item=elt}
+	{$elt}<br>
+	{/foreach}
+</div>
+{/if}
+
+<div id="theHeader">{$PAGE_BANNER}</div>
+{if isset($theSwiftHeader)}{$theSwiftHeader}{/if}
+{if not empty($header_notes)}
+<div class="header_notes">
+	{foreach from=$header_notes item=elt}
+	<p>{$elt}</p>
+  	{/foreach}
+</div>
+{/if}
Index: /extensions/stripped_galleria/template/ie6.tpl
===================================================================
--- /extensions/stripped_galleria/template/ie6.tpl	(revision 12977)
+++ /extensions/stripped_galleria/template/ie6.tpl	(revision 12977)
@@ -0,0 +1,13 @@
+<div style='border: 1px solid #F7941D; background: #FEEFDA; text-align: center; clear: both; width: 640px; height: 75px; position: relative; margin:auto;'>
+	<div style='width: 630px; margin: 0 0 0 10px; text-align: left; padding: 0; overflow: hidden; color: black;'>
+		<div style='width: 75px; float: left;'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-warning.jpg' alt='Warning!'/></div>
+		<div style='width: 275px; float: left; font-family: Arial, sans-serif;'>
+			<div style='font-size: 14px; font-weight: bold; margin-top: 12px;'>You are using an outdated browser</div>
+			<div style='font-size: 12px; margin-top: 6px; line-height: 12px;'>For a better experience using this site, please upgrade to a modern web browser.</div>
+		</div>
+		<div style='width: 75px; float: left;'><a href='http://www.firefox.com' target='_blank'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-firefox.jpg' style='border: none;' alt='Get Firefox 3.5'/></a></div>
+		<div style='width: 75px; float: left;'><a href='http://www.browserforthebetter.com/download.html' target='_blank'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-ie8.jpg' style='border: none;' alt='Get Internet Explorer 8'/></a></div>
+		<div style='width: 73px; float: left;'><a href='http://www.apple.com/safari/download/' target='_blank'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-safari.jpg' style='border: none;' alt='Get Safari 4'/></a></div>
+		<div style='float: left;'><a href='http://www.google.com/chrome' target='_blank'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-chrome.jpg' style='border: none;' alt='Get Google Chrome'/></a></div>
+	</div>
+</div>
Index: /extensions/stripped_galleria/template/index.tpl
===================================================================
--- /extensions/stripped_galleria/template/index.tpl	(revision 12977)
+++ /extensions/stripped_galleria/template/index.tpl	(revision 12977)
@@ -0,0 +1,89 @@
+{php}
+	global $pwg_loaded_plugins;
+	$this->assign('GMaps_loaded', isset($pwg_loaded_plugins[ 'GMaps' ]));
+	$this->assign('ThumbScroller_loaded', isset($pwg_loaded_plugins[ 'rv_tscroller' ]));
+{/php}
+<div class="titrePage">
+	<div class="browsePath">
+		{if empty($THUMBNAILS) || (!empty($CATEGORIES)) }
+			<span id="menuswitcher" title="{'Show/hide menu'|@translate}">{'Menu'|@translate}</span><span class="arrow"> »</span>
+		{/if}
+		<h2>{$TITLE}</h2>
+	</div>
+	{if isset($U_EDIT) or isset($U_SLIDESHOW) or !empty($PLUGIN_INDEX_ACTIONS)}
+		<div class="categoryActionsContainer">
+			<ul class="categoryActions group1">
+				{if !empty($PLUGIN_INDEX_ACTIONS)}{$PLUGIN_INDEX_ACTIONS}{/if}
+				{if isset($U_EDIT)}
+					<li class="mainAction"><a href="{$U_EDIT}" title="{'edit'|@translate}">{'edit'|@translate}</a></li>
+				{/if}
+				{if isset($U_CADDIE) }
+					<li class="mainAction"><a href="{$U_CADDIE}" title="{'add to caddie'|@translate}">{'caddie'|@translate}</a></li>
+				{/if}
+			</ul>
+		</div>
+	{/if}
+</div>
+<div id="content" {if !$stripped.hideMenu}class="menuShown"{/if}>
+{if empty($CATEGORIES) &! empty($THUMBNAILS) }
+		{$THUMBNAILS}
+{else}
+	{$MENUBAR}
+	<div id="content_cell">
+		{if !empty($PLUGIN_INDEX_CONTENT_BEFORE)}<div class="subcontent">{$PLUGIN_INDEX_CONTENT_BEFORE}</div>{/if}
+		<div id="subcontent">
+			{if isset($chronology.TITLE) }
+				<h2>{$chronology.TITLE}</h2>
+			{/if}
+			{if isset($chronology_views) }
+				{if isset($U_MODE_POSTED) }
+					<a href="{$U_MODE_POSTED}" rel="nofollow">{'display a calendar by posted date'|@translate}</a>
+				{/if}
+				{if isset($U_MODE_CREATED) }
+					<a href="{$U_MODE_CREATED}" rel="nofollow">{'display a calendar by creation date'|@translate}</a>
+				{/if}
+				<div class="calendarViews">{'View'|@translate}:
+					<select onchange="document.location = this.options[this.selectedIndex].value;">
+						{foreach from=$chronology_views item=view}
+							<option value="{$view.VALUE}"{if $view.SELECTED} selected="selected"{/if}>{$view.CONTENT}</option>
+						{/foreach}
+					</select>
+				</div>
+			{/if}
+
+			{if !empty($PLUGIN_INDEX_CONTENT_BEGIN)}<div class="content_block">{$PLUGIN_INDEX_CONTENT_BEGIN}</div>{/if}
+			{if !empty($category_search_results) }
+				<div>{'Album results for'|@translate} <strong>{$QUERY_SEARCH}</strong> :
+					{foreach from=$category_search_results item=res name=res_loop}
+					{if !$smarty.foreach.res_loop.first} &mdash; {/if}
+					{$res}
+					{/foreach}
+				</div>
+			{/if}
+			{if !empty($tag_search_results) }
+				<div>{'Tag results for'|@translate} <strong>{$QUERY_SEARCH}</strong> :
+					{foreach from=$tag_search_results item=res name=res_loop}
+						{if !$smarty.foreach.res_loop.first} &mdash; {/if}
+						{$res}
+					{/foreach}
+				</div>
+			{/if}
+			{if isset($FILE_CHRONOLOGY_VIEW) }
+				{include file=$FILE_CHRONOLOGY_VIEW}
+			{/if}
+
+			{if !empty($CONTENT_DESCRIPTION) }
+				<div class="content_block"><div class="additional_info">
+					{$CONTENT_DESCRIPTION}
+				</div></div>
+			{/if}
+
+			{if !empty($CATEGORIES) }{$CATEGORIES}{/if}
+			{if !empty($PLUGIN_INDEX_CONTENT_END) }<div class="content_block">{$PLUGIN_INDEX_CONTENT_END}</div>{/if}
+		</div> <!-- subcontent -->
+		{if !empty($PLUGIN_INDEX_CONTENT_AFTER)}<div class="subcontent">{$PLUGIN_INDEX_CONTENT_AFTER}</div>{/if}
+	</div>
+{/if}
+	<div style="clear: both;"></div>
+</div>
+ 
Index: /extensions/stripped_galleria/template/thumbnails.tpl
===================================================================
--- /extensions/stripped_galleria/template/thumbnails.tpl	(revision 12977)
+++ /extensions/stripped_galleria/template/thumbnails.tpl	(revision 12977)
@@ -0,0 +1,43 @@
+{if !empty($thumbnails)}
+{php}
+	global $stripped, $strippedgalleria;
+	$this->assign( 'stripped', $stripped );
+	$this->assign( 'strippedgalleria', $strippedgalleria );
+{/php}
+<div id="gallery" class="test">
+	{strip}{foreach from=$thumbnails item=thumbnail}
+		<a href="{$thumbnail.FILE_PATH}" {if (($thumbnail.FILE_HAS_HD) && ($strippedgalleria.lightbox == 'hd'))}rel="{$thumbnail.HD_PATH}"{/if}>
+		<img src="{$thumbnail.TN_SRC}"
+		{if ($stripped.imageCaption == 'description' )}
+			alt="{$thumbnail.FILE_DESC|strip_tags:false}"
+		{/if}
+		{if ($stripped.imageCaption == 'title' )}
+			alt="{$thumbnail.NAME}"
+		{/if}
+		/></a>
+	{/foreach}{/strip}
+</div>
+{footer_script}
+{literal}
+			var Htotal=jQuery(window).height();
+			var Hheader=jQuery("#content").position().top;
+			var Hfooter=jQuery("#footer").height();
+			var Hgallery = Htotal - Hheader - Hfooter - 2;
+            jQuery("#gallery").galleria({
+                height: Hgallery,
+				lightbox:{/literal}{if ($strippedgalleria.lightbox != 'none')}true{else}false{/if}{literal},
+				clicknext:{/literal}{if ($strippedgalleria.clicknext)}true{else}false{/if}{literal},
+				transition:'{/literal}{$strippedgalleria.transition}{literal}',
+				showCounter:false,
+				imageTimeout:600000,
+				maxScaleRatio:1,
+				extend:function() {
+					this.attachKeyboard({
+						left: this.prev,
+						right: this.next
+					});
+				}
+            });
+{/literal}
+{/footer_script}
+{/if}
Index: /extensions/stripped_galleria/theme.css
===================================================================
--- /extensions/stripped_galleria/theme.css	(revision 12977)
+++ /extensions/stripped_galleria/theme.css	(revision 12977)
@@ -0,0 +1,8 @@
+.galleria-container {background:none!important;}
+.galleria-thumbnails {margin: 0 auto;}
+.galleria-info-link {left:0}
+.galleria-lightbox-content .galleria-image {width:99.5%; left:0.25%;}
+#galleria_page #the_page {max-width:none; width:auto; margin:0 10px; }
+#galleria_page #content {background:none; padding:0; max-width:none;}
+#galleria_page #footer {padding: 0;	height:16px; margin-bottom:0;}
+#galleria_page #banner {display:none;}
Index: /extensions/stripped_galleria/themeconf.inc.php
===================================================================
--- /extensions/stripped_galleria/themeconf.inc.php	(revision 12977)
+++ /extensions/stripped_galleria/themeconf.inc.php	(revision 12977)
@@ -0,0 +1,51 @@
+<?php
+/*
+Theme Name: stripped-galleria
+Version: Auto
+Description: stripped-galleria theme
+Theme URI: http://piwigo.org/ext/extension_view.php?eid=585
+Author: Julien Capitaine (Zaphod on Piwigo forums)
+Author URI: http://www.audreyetjulien.fr/galerie
+*/
+	
+$themeconf = array(
+  'parent' => 'stripped',
+  'load_parent_css' => true,
+  'load_parent_local_head' => true,
+  'name' => 'stripped-galleria',
+  'theme_dir' => 'stripped-galleria',
+  'icon_dir' => 'themes/stripped/icon',
+  'admin_icon_dir' => 'themes/default/icon/admin',
+  'mime_icon_dir' => 'themes/default/icon/mimetypes/',
+  'local_head' => 'local_head.tpl',
+);
+
+global $conf, $stripped, $strippedgalleria;
+
+// Need upgrade?
+if (!isset($conf['stripped-galleria']))
+  include(PHPWG_THEMES_PATH.'stripped-galleria/admin/upgrade.inc.php');
+
+$stripped['maxThumb']=999;
+$stripped = array_merge( unserialize( $conf['stripped'] ), (array)$stripped );
+$strippedgalleria = unserialize( $conf['stripped-galleria'] );
+if (!isset($strippedgalleria['lightbox'])) $strippedgalleria['lightbox']='none';
+
+// adresse image HD depuis thumbs
+
+add_event_handler('loc_end_index_thumbnails', 'add_thumbnails_high_url', 50, 2);
+function add_thumbnails_high_url($tpl_var, $pictures)
+{
+  include_once(PHPWG_ROOT_PATH.'include/functions_picture.inc.php');
+  foreach($tpl_var as $key => $value)
+  {
+    if ($value['FILE_HAS_HD'])
+    {
+      $tpl_var[$key]['HD_PATH'] = get_high_path($pictures[$key]);
+    }
+  }
+  return $tpl_var;
+}
+
+
+?>
