(function($){    var $$;    $$ = $.fn.galleria = function($options){        if (!$$.hasCSS()) {            return false;        }        $.historyInit($$.onPageLoad);        var $defaults = {            insert: '.galleria_container',            history: true,            clickNext: true,            onImage: function(image, caption, thumb){            },            onThumb: function(thumb){            }        };        var $opts = $.extend($defaults, $options);        for (var i in $opts) {            if (i) {                $.galleria[i] = $opts[i];            }        }        var _insert = ($($opts.insert).is($opts.insert)) ? $($opts.insert) : jQuery(document.createElement('div')).insertBefore(this);        var _div = $(document.createElement('div')).addClass('galleria_wrapper');        var _span = $(document.createElement('span')).addClass('caption');        _insert.addClass('galleria_container').append(_div).append(_span);        return this.each(function(){            $(this).addClass('galleria');            $(this).children('li').each(function(i){                var _container = $(this);                var _o = $.meta ? $.extend({}, $opts, _container.data()) : $opts;                _o.clickNext = $(this).is(':only-child') ? false : _o.clickNext;                var _a = $(this).find('a').is('a') ? $(this).find('a') : false;                var _img = $(this).children('img').css('display', 'none');                var _src = _a ? _a.attr('href') : _img.attr('src');                var _title = _a ? _a.attr('title') : _img.attr('title');                var _loader = new Image();                if (_o.history && (window.location.hash && window.location.hash.replace(/\#/, '') == _src)) {                    _container.siblings('.active').removeClass('active');                    _container.addClass('active');                }                $(_loader).load(function(){                    $(this).attr('alt', _img.attr('alt'));                    var _thumb = _a ? _a.find('img').addClass('thumb noscale').css('display', 'none') : _img.clone(true).addClass('thumb').css('display', 'none');                    if (_a) {                        _a.replaceWith(_thumb);                    }                    if (!_thumb.hasClass('noscale')) {                        var w = Math.ceil(_img.width() / _img.height() * _container.height());                        var h = Math.ceil(_img.height() / _img.width() * _container.width());                        if (w < h) {                            _thumb.css({                                height: 'auto',                                width: _container.width(),                                marginTop: -(h - _container.height()) / 2                            });                        }                        else {                            _thumb.css({                                width: 'auto',                                height: _container.height(),                                marginLeft: -(w - _container.width()) / 2                            });                        }                    }                    else {                        window.setTimeout(function(){                            _thumb.css({                                marginLeft: -(_thumb.width() - _container.width()) / 2,                                marginTop: -(_thumb.height() - _container.height()) / 2                            });                        }, 1);                    }                    _thumb.attr('rel', _src);                    _thumb.attr('title', _title);                    _thumb.click(function(){                        $.galleria.activate(_src);                    });                    _thumb.hover(function(){                        $(this).addClass('hover');                    }, function(){                        $(this).removeClass('hover');                    });                    _container.hover(function(){                        _container.addClass('hover');                    }, function(){                        _container.removeClass('hover');                    });                    _container.prepend(_thumb);                    _thumb.css('display', 'block');                    _o.onThumb(jQuery(_thumb));                    if (_container.hasClass('active')) {                        $.galleria.activate(_src);                    }                    _img.remove();                }).error(function(){                    _container.html('<span class="error" style="color:red">Error loading image: ' + _src + '</span>');                }).attr('src', _src);            });        });    };    $$.nextSelector = function(selector){        return $(selector).is(':last-child') ? $(selector).siblings(':first-child') : $(selector).next();    };    $$.previousSelector = function(selector){        return $(selector).is(':first-child') ? $(selector).siblings(':last-child') : $(selector).prev();    };    $$.hasCSS = function(){        $('body').append($(document.createElement('div')).attr('id', 'css_test').css({            width: '1px',            height: '1px',            display: 'none'        }));        var _v = ($('#css_test').width() != 1) ? false : true;        $('#css_test').remove();        return _v;    };    $$.onPageLoad = function(_src){        var _wrapper = $('.galleria_wrapper');        var _thumb = $('.galleria img[rel="' + _src + '"]');        if (_src) {            if ($.galleria.history) {                window.location = window.location.href.replace(/\#.*/, '') + '#' + _src;            }            _thumb.parents('li').siblings('.active').removeClass('active');            _thumb.parents('li').addClass('active');            var _img = $(new Image()).attr('src', _src).addClass('replaced');            _wrapper.empty().append(_img);            _wrapper.siblings('.caption').text(_thumb.attr('title'));            $.galleria.onImage(_img, _wrapper.siblings('.caption'), _thumb);            if ($.galleria.clickNext) {                _img.css('cursor', 'pointer').click(function(){                    $.galleria.next();                });            }        }        else {            _wrapper.siblings().andSelf().empty();            $('.galleria li.active').removeClass('active');        }        $.galleria.current = _src;    };    $.extend({        galleria: {            current: '',            onImage: function(){            },            activate: function(_src){                if ($.galleria.history) {                    $.historyLoad(_src);                }                else {                    $$.onPageLoad(_src);                }            },            next: function(){                var _next = $($$.nextSelector($('.galleria img[rel="' + $.galleria.current + '"]').parents('li'))).find('img').attr('rel');                $.galleria.activate(_next);            },            prev: function(){                var _prev = $($$.previousSelector($('.galleria img[rel="' + $.galleria.current + '"]').parents('li'))).find('img').attr('rel');                $.galleria.activate(_prev);            }        }    });})(jQuery);jQuery.extend({    historyCurrentHash: undefined,    historyCallback: undefined,    historyInit: function(callback){        jQuery.historyCallback = callback;        var current_hash = location.hash;        jQuery.historyCurrentHash = current_hash;        if (jQuery.browser.msie) {            if (jQuery.historyCurrentHash === '') {                jQuery.historyCurrentHash = '#';            }            jQuery("body").prepend('<iframe id="jQuery_history" style="display: none;"></iframe>');            var ihistory = jQuery("#jQuery_history")[0];            var iframe = ihistory.contentWindow.document;            iframe.open();            iframe.close();            iframe.location.hash = current_hash;        }        else             if (jQuery.browser.safari) {                jQuery.historyBackStack = [];                jQuery.historyBackStack.length = history.length;                jQuery.historyForwardStack = [];                jQuery.isFirst = true;            }        jQuery.historyCallback(current_hash.replace(/^#/, ''));        setInterval(jQuery.historyCheck, 100);    },    historyAddHistory: function(hash){        jQuery.historyBackStack.push(hash);        jQuery.historyForwardStack.length = 0;        this.isFirst = true;    },    historyCheck: function(){        if (jQuery.browser.msie) {            var ihistory = jQuery("#jQuery_history")[0];            var iframe = ihistory.contentDocument || ihistory.contentWindow.document;            var current_hash = iframe.location.hash;            if (current_hash != jQuery.historyCurrentHash) {                location.hash = current_hash;                jQuery.historyCurrentHash = current_hash;                jQuery.historyCallback(current_hash.replace(/^#/, ''));            }        }        else             if (jQuery.browser.safari) {                if (!jQuery.dontCheck) {                    var historyDelta = history.length - jQuery.historyBackStack.length;                    if (historyDelta) {                        jQuery.isFirst = false;                        var i;                        if (historyDelta < 0) {                            for (i = 0; i < Math.abs(historyDelta); i++) {                                jQuery.historyForwardStack.unshift(jQuery.historyBackStack.pop());                            }                        }                        else {                            for (i = 0; i < historyDelta; i++) {                                jQuery.historyBackStack.push(jQuery.historyForwardStack.shift());                            }                        }                        var cachedHash = jQuery.historyBackStack[jQuery.historyBackStack.length - 1];                        if (cachedHash !== undefined) {                            jQuery.historyCurrentHash = location.hash;                            jQuery.historyCallback(cachedHash);                        }                    }                    else                         if (jQuery.historyBackStack[jQuery.historyBackStack.length - 1] === undefined && !jQuery.isFirst) {                            if (document.URL.indexOf('#') >= 0) {                                jQuery.historyCallback(document.URL.split('#')[1]);                            }                            else {                                current_hash = location.hash;                                jQuery.historyCallback('');                            }                            jQuery.isFirst = true;                        }                }            }            else {                current_hash = location.hash;                if (current_hash != jQuery.historyCurrentHash) {                    jQuery.historyCurrentHash = current_hash;                    jQuery.historyCallback(current_hash.replace(/^#/, ''));                }            }    },    historyLoad: function(hash){        var newhash;        if (jQuery.browser.safari) {            newhash = hash;        }        else {            newhash = '#' + hash;            location.hash = newhash;        }        jQuery.historyCurrentHash = newhash;        if (jQuery.browser.msie) {            var ihistory = $("#jQuery_history")[0];            var iframe = ihistory.contentWindow.document;            iframe.open();            iframe.close();            iframe.location.hash = newhash;            jQuery.historyCallback(hash);        }        else             if (jQuery.browser.safari) {                jQuery.dontCheck = true;                this.historyAddHistory(hash);                var fn = function(){                    jQuery.dontCheck = false;                };                window.setTimeout(fn, 200);                jQuery.historyCallback(hash);                location.hash = newhash;            }            else {                jQuery.historyCallback(hash);            }    }});