/**
 * jQuery Lightbox Plugin (balupton edition) - Lightboxes for jQuery
 * Copyright (C) 2007-2009 Benjamin Arthur Lupton
 * http://jquery.com/plugins/project/jquerylightbox_bal
 *
 * This file is part of jQuery Lightbox (balupton edition).
 * 
 * You should have received a copy of the GNU Affero General Public License
 * along with jQuery Lightbox (balupton edition).  If not, see <http://www.gnu.org/licenses/>.
 */
 (function($)
 {
    if (typeof $.log === 'undefined') {
        if (!$.browser.safari && typeof window.console !== 'undefined' && typeof window.console.log === 'function')
        {
            $.log = function() {
                var args = [];
                for (var i = 0; i < arguments.length; i++) {
                    args.push(arguments[i]);
                }
                window.console.log.apply(window.console, args);
            }
            $.console = {
                log: $.log,
                debug: window.console.debug || $.log,
                warn: window.console.warn || $.log,
                error: window.console.error || $.log,
                trace: window.console.trace || $.log
            };
            $log = $.log;
            $debug = $.console.debug;
            $warn = $.console.warn;
            $error = $.console.error;
            $trace = $.console.trace;
        }
        else
        {
            $.log = function() {};
            $.console = {
                log: $.log,
                debug: $.log,
                warn: $.log,
                error: alert,
                trace: $.log
            };
            $log = $.log;
            $debug = $.console.debug;
            $warn = $.console.warn;
            $error = $.console.error;
            $trace = $.console.trace;
        }
    }
    $.params_to_json = $.params_to_json ||
    function(params)
    {
        params = String(params);
        params = params.substring(params.indexOf('?') + 1);
        params = params.replace(/\+/g, '%20');
        if (params.substring(0, 1) === '{' && params.substring(params.length - 1) === '}')
        {
            return eval(decodeURIComponent(params));
        }
        params = params.split(/\&|\&\;/);
        var json = {};
        for (var i = 0, n = params.length; i < n; ++i)
        {
            var param = params[i] || null;
            if (param === null) {
                continue;
            }
            param = param.split('=');
            if (param === null) {
                continue;
            }
            var key = param[0] || null;
            if (key === null) {
                continue;
            }
            if (typeof param[1] === 'undefined') {
                continue;
            }
            var value = param[1];
            key = decodeURIComponent(key);
            value = decodeURIComponent(value);
            try {
                value = eval(value);
            } catch(e) {}
            var keys = key.split('.');
            if (keys.length === 1)
            {
                json[key] = value;
            }
            else
            {
                var path = '';
                for (ii in keys)
                {
                    key = keys[ii];
                    path += '.' + key;
                    eval('json' + path + ' = json' + path + ' || {}');
                }
                eval('json' + path + ' = value');
            }
        }
        return json;
    };
    var $toArray = function(item) {
        return ($type(item) !== 'array') ? [item] : item;
    }
    Array.prototype.remove = function(from, to) {
        var rest = this.slice((to || from) + 1 || this.length);
        this.length = from < 0 ? this.length + from: from;
        return this.push.apply(this, rest);
    };
    Array.prototype.get = function(index, current) {
        if (index === 'first') index = 0;
        else if (index === 'last') index = this.length - 1;
        else if (!index && index !== 0) index = this.index;
        if (current !== false) this.setIndex(index);
        return this[index] || undefined;
    };
    Array.prototype.each = function(fn) {
        for (var i = 0; i < this.length; ++i) {
            if (fn(i, this[i], this) === false)
            break;
        }
        return this;
    }
    Array.prototype.setIndex = function(index) {
        if (index < this.length && index >= 0) {
            this.index = index;
        } else {
            this.index = null;
        }
        return this;
    };
    Array.prototype.current = function(index) {
        return this.get(index, true);
    };
    Array.prototype.isEmpty = function() {
        return this.length === 0;
    };
    Array.prototype.isSingle = function() {
        return this.length === 1;
    };
    Array.prototype.isMany = function() {
        return this.length !== 0;
    };
    Array.prototype.isLast = function(index) {
        index = typeof index === 'undefined' ? this.index: index;
        return ! this.isEmpty() && index === this.length - 1;
    }
    Array.prototype.isFirst = function(index) {
        index = typeof index === 'undefined' ? this.index: index;
        return ! this.isEmpty() && index === 0;
    }
    Array.prototype.clear = function() {
        this.length = 0;
    };
    Array.prototype.next = function(update) {
        return this.get(this.index + 1, update);
    };
    Array.prototype.prev = function(update) {
        return this.get(this.index - 1, update);
    };
    Array.prototype.reset = function() {
        this.index = null;
        return this;
    };
    Array.prototype.set = function(index, item) {
        if (index < this.length && index >= 0) {
            this[index] = item;
        } else {
            $error('index above array length');
            return false;
        }
        return this;
    };
    Array.prototype.loop = function() {
        if (!this.index && this.index !== 0) {
            return this.current(0);
        }
        return this.next();
    };
    Array.prototype.add = function() {
        this.push.apply(this, arguments);
        return this;
    };
    Array.prototype.insert = function(index, item) {
        if (typeof index !== 'number') {
            index = this.length;
        }
        index = index <= this.length ? index: this.length;
        var rest = this.slice(index);
        this.length = index;
        this.push(item);
        this.push.apply(this, rest);
        return this;
    };
    $.LightboxClass = function()
    {
        this.construct();
    };
    $.fn.lightbox = function(options)
    {
        $.Lightbox = $.Lightbox || new $.LightboxClass();
        if ($.Lightbox.ie6 && !$.Lightbox.ie6_support)
        {
            return this;
        }
        options = $.extend({
            start: false,
            events: true
        },
        options);
        var $group = $(this);
        if (options.events)
        {
            $group.unbind('click').click(function() {
                var $obj = $(this);
                var index = $group.index($obj);
                if (!$.Lightbox.init(index, $group))
                {
                    return false;
                }
                if (!$.Lightbox.start())
                {
                    return false;
                }
                return false;
            });
            $group.addClass('lightbox-enabled');
        }
        if (options.start)
        {
            var obj = $(this);
            if (!$.Lightbox.init(0, $group))
            {
                return this;
            }
            if (!$.Lightbox.start())
            {
                return this;
            }
        }
        return this;
    };
    $.extend($.LightboxClass.prototype, {
        images: [],
        constructed: false,
        compressed: null,
        src: null,
        baseurl: null,
        files: {
            compressed: {
                js: {
                    lightbox: 'js/jquery.lightbox.min.js',
                    colorBlend: 'js/jquery.color.min.js'
                },
                css: {
                    lightbox: 'css/jquery.lightbox.css'
                }
            },
            uncompressed: {
                js: {
                    lightbox: 'js/jquery.lightbox.js',
                    colorBlend: 'js/jquery.color.js'
                },
                css: {
                    lightbox: 'css/jquery.lightbox.css'
                }
            },
            images: {
                prev: 'images/prev.gif',
                next: 'images/next.gif',
                blank: 'images/blank.gif',
                loading: 'images/loading.gif'
            }
        },
        text: {
            image: 'Bild',
            of: 'von',
            close: '<img src="typo3conf/ext/perfectlightboxjquery/res/images/close.gif" alt="schliessen X" />',
            closeInfo: 'You can also click anywhere outside the image to close.',
            download: 'Download.',
            help: {
                close: 'Click to close',
                interact: 'Hover to interact'
            },
            about: {
                text: 'jQuery Lightbox Plugin (balupton edition)',
                title: 'Licenced under the GNU Affero General Public License.',
                link: 'http://jquery.com/plugins/project/jquerylightbox_bal'
            }
        },
        keys: {
            close: 'c',
            prev: 'p',
            next: 'n'
        },
        handlers: {
            show: null
        },
        opacity: 0.9,
        padding: 10,
        speed: 400,
        rel: 'lightbox',
        auto_relify: true,
        auto_scroll: 'follow',
        auto_resize: true,
        ie6: null,
        ie6_support: true,
        ie6_upgrade: true,
        colorBlend: null,
        download_link: false,
        show_helper_text: true,
        show_linkback: true,
        show_info: true,
        show_extended_info: true,
        auto_resize_percentage: 70,
        slideshowAutoplay: false,
        slideshowInterval: 5000,
        slideshowAutoclose: false,
        presentationMode: false,
        slideshowEnabled: false,
        slideshowActive: false,
        slideshowIDArray: new Array(),
        options: ['show_helper_text', 'auto_scroll', 'auto_resize', 'download_link', 'show_info', 'show_extended_info', 'ie6_support', 'ie6_upgrade', 'colorBlend', 'baseurl', 'files', 'text', 'show_linkback', 'keys', 'opacity', 'padding', 'speed', 'rel', 'auto_relify', 'presentationMode', 'slideshowEnabled', 'slideshowAutoplay', 'slideshowInterval', 'slideshowAutoclose', 'slideshowActive', 'slideshowIDArray'],
        construct: function(options)
        {
            var initial = typeof this.constructed === 'undefined' || this.constructed === false;
            this.constructed = true;
            var domReady = initial;
            options = options || {};
            var prepend = function(item, value) {
                if (typeof item === 'object') {
                    for (var i in item) {
                        item[i] = prepend(item[i], value);
                    }
                } else if (typeof value === 'array') {
                    for (var i = 0, n = item.length; i < n; ++i) {
                        item[i] = prepend(item[i], value);
                    }
                } else {
                    item = value + item;
                }
                return item;
            }
            if (initial && (typeof options.files === 'undefined'))
            {
                this.compressed = null;
                var $script = $('script[src*=' + this.files.compressed.js.lightbox + ']:first');
                if ($script.length !== 0) {
                    $.extend(true, this.files, this.files.compressed);
                    this.compressed = true;
                } else {
                    $script = $('script[src*=' + this.files.uncompressed.js.lightbox + ']:first');
                    if ($script.length !== 0) {
                        $.extend(true, this.files, this.files.uncompressed);
                        this.compressed = false;
                    } else {}
                }
                if (this.compressed === null)
                {
                    $.console.error('Lightbox was not able to find it\'s javascript script tag necessary for auto-inclusion.');
                    domReady = false;
                }
                else
                {
                    this.src = $script.attr('src');
                    this.baseurl = this.src.substring(0, this.src.indexOf(this.files.js.lightbox));
                    this.files = prepend(this.files, this.baseurl);
                    options = $.extend(options, $.params_to_json(this.src));
                }
                this.images.image = {
                    src: '',
                    title: '',
                    description: '',
                    name: '',
                    color: null,
                    width: null,
                    height: null,
                    id: null,
                    image: true
                };
                this.images.prepare = function(obj) {
                    var image = $.extend({},
                    this.image);
                    if (obj.tagName) {
                        obj = $(obj);
                        if (obj.attr('src') || obj.attr('href')) {
                            image.src = obj.attr('src') || obj.attr('href');
                            image.title = obj.attr('title') || obj.attr('alt') || image.title;
                            image.name = obj.attr('name') || '';
                            image.color = obj.css('backgroundColor');
                            var s = image.title.indexOf(': ');
                            if (s > 0)
                            {
                                image.description = image.title.substring(s + 2) || image.description;
                                image.title = image.title.substring(0, s) || image.title;
                            }
                        } else {
                            image = null;
                        }
                    } else if (obj.src) {
                        image = $.extend(this.image, obj);
                    } else {
                        image = null;
                    }
                    if (image) {
                        image.id = image.id || image.src + image.title + image.description;
                    }
                    return image;
                }
                this.images.create = function(obj) {
                    var images = this;
                    if (obj.each) {
                        obj.each(function(index, item) {
                            images.create(item);
                        });
                        return;
                    }
                    var image = images.prepare(obj);
                    if (!image) {
                        $.console.error('We dont know what we have:', obj, image);
                    } else {
                        images.push(image);
                    }
                    return images;
                };
            }
            else
            if (typeof options.files === 'object')
            {
                options.files = prepend(options.files, this.baseurl);
            }
            else
            {
                domReady = false;
            }
            for (var i in this.options)
            {
                var name = this.options[i];
                if ((typeof options[name] === 'object') && (typeof this[name] === 'object'))
                {
                    this[name] = $.extend(true, this[name], options[name]);
                }
                else if (typeof options[name] !== 'undefined')
                {
                    this[name] = options[name];
                }
            }
            delete i;
            if (initial && navigator.userAgent.indexOf('MSIE 6') >= 0)
            {
                this.ie6 = true;
            }
            else
            {
                this.ie6 = false;
            }
            if (domReady || typeof options.download_link !== 'undefined' || typeof options.colorBlend !== 'undefined' || typeof options.files === 'object' || typeof options.text === 'object' || typeof options.show_linkback !== 'undefined' || typeof options.scroll_with !== 'undefined')
            {
                $(function() {
                    $.Lightbox.domReady();
                });
            }
            return true;
        },
        domReady: function()
        {
          //alert('dR: '+this.ie6_upgrade);
          //if(!this.ie6_upgrade) return;
          
          $('#lightbox,#lightbox-overlay').remove();
            $('body').append('<div id="lightbox-overlay">' + '<div id="lightbox-overlay-text">' +
            (false ? '<p>' + '<span id="lightbox-overlay-text-about">' + '<a href="#" title="' + this.text.about.title + '">' +
            this.text.about.text + '</a>' + '</span>' + '</p>' + '<p> </p>': '') +
            (false ? '<p>' + '<span id="lightbox-overlay-text-close">' +
            this.text.help.close + '</span><br /> ' + '<span id="lightbox-overlay-text-interact">' +
            this.text.help.interact + '</span>' + '</p>': '') + '</div>' + '</div>' + '<div id="lightbox">' + '<div id="lightbox-imageBox">' + '<div id="lightbox-imageContainer">' + '<img id="lightbox-image" />' + '<div id="lightbox-nav">' + '<a href="#" id="lightbox-nav-btnPrev">' + '</a>' + '<a href="#" id="lightbox-nav-btnNext">' + '</a>' + '</div>' + '<div id="lightbox-loading">' + '<a href="#" id="lightbox-loading-link">' + '<img src="' + this.files.images.loading + '" />' + '</a>' + '</div>' + '</div>' + '</div>' + '<div id="lightbox-infoBox">' + '<div id="lightbox-infoContainer">' + '<div id="lightbox-infoHeader">' + '<span id="lightbox-caption-title"></span>' + '<span id="lightbox-caption">' + '<span id="lightbox-caption-seperator"></span>' + '<span id="lightbox-caption-description"></span>' + '</span>' + '</div>' + '<div id="lightbox-infoFooter">' + '<span id="lightbox-currentNumber"></span>' + '<span id="lightbox-close">' + '<a href="#" id="lightbox-close-button" title="' + this.text.closeInfo + '">' + this.text.close + '</a>' + '</span>' + '<a id="pauseLink" href="#"></a>' + '<a id="playLink" href="#"></a>' +
            (false ? '<a id="saveLink" target="_blank"></a>': '') + '</div>' + '<div id="lightbox-infoContainer-clear">' + '</div>' + '</div>' + '</div>' + '</div>');
            $('#playLink').unbind().click(function() {
                $('#pauseLink').show();
                $('#playLink').hide();
                $.Lightbox.slideshowActive = true;
                $.Lightbox.triggerSlideshow();
                return false;
            });
            $('#pauseLink').unbind().click(function() {
                $('#pauseLink').hide();
                $('#playLink').show();
                $.Lightbox.stopSlideshow();
                return false;
            });
            this.resizeBoxes();
            this.repositionBoxes();
            $('#lightbox,#lightbox-overlay,#lightbox-overlay-text-interact').hide();
            if (this.ie6 && this.ie6_support)
            {
                $('#lightbox-overlay').css({
                    position: 'absolute',
                    top: '0px',
                    left: '0px'
                });
            }
            $.each(this.files.images,
            function()
            {
                var preloader = new Image();
                preloader.onload = function() {
                    preloader.onload = null;
                    preloader = null;
                };
                preloader.src = this;
            });
            $(window).unbind('resize').resize(function()
            {
                $.Lightbox.resizeBoxes('resized');
            });
            if (this.scroll === 'follow')
            {
                $(window).scroll(function()
                {
                    $.Lightbox.repositionBoxes();
                });
            }
            $('#lightbox-nav-btnPrev').unbind().hover(function() {
                $(this).css({
                    'background': 'url(' + $.Lightbox.files.images.prev + ') left 45% no-repeat'
                });
            },
            function() {
                $(this).css({
                    'background': 'transparent url(' + $.Lightbox.files.images.blank + ') no-repeat'
                });
            }).click(function() {
                $.Lightbox.stopSlideshow();
                $.Lightbox.images.prev();
                $.Lightbox.showImage();
                return false;
            });
            $('#lightbox-nav-btnNext').unbind().hover(function() {
                $(this).css({
                    'background': 'url(' + $.Lightbox.files.images.next + ') right 45% no-repeat'
                });
            },
            function() {
                $(this).css({
                    'background': 'transparent url(' + $.Lightbox.files.images.blank + ') no-repeat'
                });
            }).click(function() {
                $.Lightbox.stopSlideshow();
                $.Lightbox.images.next();
                $.Lightbox.showImage();
                return false;
            });
            if (this.show_linkback)
            {
                $('#lightbox-overlay-text-about a').click(function() {
                    window.open($.Lightbox.text.about.link);
                    return false;
                });
            }
            $('#lightbox-overlay-text-close').unbind().hover(function() {
                $('#lightbox-overlay-text-interact').fadeIn();
            },
            function() {
                $('#lightbox-overlay-text-interact').fadeOut();
            });
            $('#lightbox-overlay, #lightbox, #lightbox-loading-link, #lightbox-btnClose').unbind().click(function() {
                $.Lightbox.stopSlideshow();
                return false;
            });
            $('#lightbox-overlay, #lightbox, #lightbox-loading-link, #lightbox-btnClose').unbind().click(function() {
                $.Lightbox.finish();
                return false;
            });
            $('#lightbox-infoBox').unbind().click(function() {
                return false;
            });
            $('#lightbox-close').unbind().click(function() {
                $.Lightbox.finish();
                return false;
            });
            if (this.auto_relify)
            {
                this.relify();
            }
            return true;
        },
        relify: function()
        {
            var groups = {};
            var groups_n = 0;
            var orig_rel = this.rel;
            $.each($('[rel*=' + orig_rel + ']'),
            function(index, obj) {
                var detailed_rel = $(obj).attr('rel');
                if (detailed_rel.toLowerCase().match('present')) {
                    $.Lightbox.presentationMode = true;
                } else {
                    $.Lightbox.presentationMode = false;
                }
                if (detailed_rel.toLowerCase().match('slideshow')) {
                    $.Lightbox.slideshowEnabled = true;
                } else {
                    $.Lightbox.slideshowEnabled = false;
                    $.Lightbox.slideshowActive = false;
                    $('#pauseLink').hide();
                    $('#playLink').hide();
                }
                var rel = $(obj).attr('rel');
                if (rel === orig_rel)
                {
                    rel = groups_n;
                }
                if (typeof groups[rel] === 'undefined')
                {
                    groups[rel] = [];
                    groups_n++;
                }
                groups[rel].push(obj);
            });
            $.each(groups,
            function(index, group) {
                $(group).lightbox();
            });
            return true;
        },
        init: function(image, images)
        {
            if (typeof images === 'undefined') {
                images = image;
                image = 0;
            }
            this.images.clear();
            this.images.create(images);
            if (this.images.isEmpty()) {
                $.console.warn('WARNING', 'Lightbox started, but no images: ', image, images);
                return false;
            }
            if (!this.images.current(image)) {
                $.console.warn('WARNING', 'Could not find current image: ', image, this.images);
                return false;
            }
            return true;
        },
        start: function()
        {
            if ($.Lightbox.slideshowEnabled) {
                $.Lightbox.slideshowActive = $.Lightbox.slideshowAutoplay;
            }
            this.visible = true;
            if (this.scroll === 'disable')
            {
                $(document.body).css('overflow', 'hidden');
            }
            $('embed, object, select').css('visibility', 'hidden');
            this.resizeBoxes('general');
            this.repositionBoxes({
                'speed': 0
            });
            $('#lightbox-infoFooter').hide();
            $('#lightbox-image,#lightbox-nav,#lightbox-nav-btnPrev,#lightbox-nav-btnNext,#lightbox-infoBox').hide();
            $('#lightbox-overlay').css('opacity', this.opacity).fadeIn(400,
            function() {
                $('#lightbox').fadeIn(300);
                if (!$.Lightbox.showImage()) {
                    $.Lightbox.finish();
                    return false;
                }
            });
            return true;
        },
        finish: function()
        {
            $('#lightbox').hide();
            $('#lightbox-overlay').fadeOut(function() {
                $('#lightbox-overlay').hide();
            });
            $('embed, object, select').css({
                'visibility': 'visible'
            });
            this.images.reset();
            if (this.scroll === 'disable')
            {
                $(document.body).css('overflow', 'visible');
            }
            this.visible = false;
        },
        resizeBoxes: function(type)
        {
            if (type !== 'transition')
            {
                var $body = $(this.ie6 ? document.body: document);
                $('#lightbox-overlay').css({
                    width: $body.width(),
                    height: $body.height()
                });
                delete $body;
            }
            switch (type)
            {
            case 'general':
                return true;
                break;
            case 'resized':
                if (this.auto_resize === false)
                {
                    this.repositionBoxes({
                        'nHeight': nHeight,
                        'speed': this.speed
                    });
                    return true;
                }
            case 'transition':
            default:
                break;
            }
            var image = this.images.current();
            if (!image || !image.width || !this.visible)
            {
                return false;
            }
            var iWidth = image.width;
            var iHeight = image.height;
            var wWidth = $(window).width();
            var wHeight = $(window).height();
            if (this.auto_resize !== false)
            {
                var maxWidth = Math.floor(wWidth * ($.Lightbox.auto_resize_percentage / 100));
                var maxHeight = Math.floor(wHeight * ($.Lightbox.auto_resize_percentage / 100));
                var resizeRatio;
                while (iWidth > maxWidth || iHeight > maxHeight)
                {
                    if (iWidth > maxWidth)
                    {
                        resizeRatio = maxWidth / iWidth;
                        iWidth = maxWidth;
                        iHeight = Math.floor(iHeight * resizeRatio);
                    }
                    if (iHeight > maxHeight)
                    {
                        resizeRatio = maxHeight / iHeight;
                        iHeight = maxHeight;
                        iWidth = Math.floor(iWidth * resizeRatio);
                    }
                }
            }
            var cWidth = $('#lightbox-imageBox').width();
            var cHeight = $('#lightbox-imageBox').height();
            var nWidth = (iWidth + (this.padding * 2));
            var nHeight = (iHeight + (this.padding * 2));
            var dWidth = cWidth - nWidth;
            var dHeight = cHeight - nHeight;
            $('#lightbox-nav-btnPrev,#lightbox-nav-btnNext').css('height', nHeight);
            $('#lightbox-infoBox').css('width', nWidth);
            if (type === 'transition')
            {
                if (dWidth === 0 && dHeight === 0)
                {
                    this.pause(this.speed / 3);
                    this.showImage(null, 3);
                }
                else
                {
                    $('#lightbox-image').width(iWidth).height(iHeight);
                    $('#lightbox-imageBox').animate({
                        width: nWidth,
                        height: nHeight
                    },
                    this.speed,
                    function() {
                        $.Lightbox.showImage(null, 3);
                    });
                }
            }
            else
            {
                $('#lightbox-image').animate({
                    width: iWidth,
                    height: iHeight
                },
                this.speed);
                $('#lightbox-imageBox').animate({
                    width: nWidth,
                    height: nHeight
                },
                this.speed);
            }
            this.repositionBoxes({
                'nHeight': nHeight,
                'speed': this.speed
            });
            return true;
        },
        repositioning: false,
        reposition_failsafe: false,
        repositionBoxes: function(options)
        {
            if (this.repositioning)
            {
                this.reposition_failsafe = true;
                return null;
            }
            this.repositioning = true;
            options = $.extend({},
            options);
            options.callback = options.callback || null;
            options.speed = options.speed || 'slow';
            var pageScroll = this.getPageScroll();
            var nHeight = options.nHeight || parseInt($('#lightbox').height(), 10);
            var nTop = pageScroll.yScroll + ($(window).height() - nHeight) / 2.5;
            var nLeft = pageScroll.xScroll;
            var css = {
                left: nLeft,
                top: nTop
            };
            if (options.speed) {
                $('#lightbox').animate(css, 'slow',
                function() {
                    if ($.Lightbox.reposition_failsafe)
                    {
                        $.Lightbox.repositioning = $.Lightbox.reposition_failsafe = false;
                        $.Lightbox.repositionBoxes(options);
                    }
                    else
                    {
                        $.Lightbox.repositioning = false;
                        if (options.callback)
                        {
                            options.callback();
                        }
                    }
                });
            }
            else
            {
                $('#lightbox').css(css);
                if (this.reposition_failsafe)
                {
                    this.repositioning = this.reposition_failsafe = false;
                    this.repositionBoxes(options);
                }
                else
                {
                    this.repositioning = false;
                }
            }
            return true;
        },
        changeImage: function(direction) {
            $.Lightbox.images.next();
            $.Lightbox.showImage();
        },
        linkShowImageByNumber: function(number) {
            $.Lightbox.stopSlideshow();
            $.Lightbox.showImage(number, 1);
            return false;
        },
        triggerSlideshow: function() {
            if (!this.images.isLast()) {
                $.Lightbox.slideshowIDArray[this.images.index] = setTimeout('$.Lightbox.changeImage()', $.Lightbox.slideshowInterval);
            } else if ($.Lightbox.slideshowAutoclose === 'loop') {
                setTimeout('$.Lightbox.showImage($.Lightbox.images.get(\'first\',true), 1)', $.Lightbox.slideshowInterval);
            } else if ($.Lightbox.slideshowAutoclose === true) {
                $.Lightbox.slideshowIDArray[this.images.index] = setTimeout('$.Lightbox.finish()', $.Lightbox.slideshowInterval);
            }
        },
        stopSlideshow: function() {
            if ($.Lightbox.slideshowActive === true) {
                if (typeof($.Lightbox.slideshowIDArray[$.Lightbox.images.index]) !== 'undefined') {
                    window.clearTimeout($.Lightbox.slideshowIDArray[$.Lightbox.images.index]);
                }
                $.Lightbox.slideshowActive = false;
                $('#pauseLink').hide();
                $('#playLink').show();
            }
        },
        visible: false,
        showImage: function(image, step) {
            step = step || 1;
            image = this.images.current(image) || this.images.get('first', true);
            if (!image) {
                return;
            }
            switch (step)
            {
            case 1:
                this.KeyboardNav_Disable();
                $('#lightbox-loading').show();
                $('#lightbox-image,#lightbox-nav,#lightbox-nav-btnPrev,#lightbox-nav-btnNext,#lightbox-infoBox').hide();
                $('#lightbox-imageBox').unbind();
                if (image.width && image.height)
                {
                    this.showImage(null, 2);
                }
                else
                {
                    var preloader = new Image();
                    preloader.onload = function()
                    {
                        image.width = preloader.width;
                        image.height = preloader.height;
                        $.Lightbox.showImage(null, 2);
                        preloader.onload = null;
                        preloader = null;
                    };
                    preloader.src = image.src;
                }
                break;
            case 2:
                $('#lightbox-image').attr('src', image.src);
                if (typeof this.padding === 'undefined' || this.padding === null || isNaN(this.padding))
                {
                    this.padding = parseInt($('#lightbox-imageContainer').css('padding-left'), 10) || parseInt($('#lightbox-imageContainer').css('padding'), 10) || 0;
                }
                if (this.colorBlend)
                {
                    $('#lightbox-overlay').animate({
                        'backgroundColor': image.color
                    },
                    this.speed * 2);
                    $('#lightbox-imageBox').css('borderColor', image.color);
                }
                this.resizeBoxes('transition');
                break;
            case 3:
                $('#lightbox-loading').hide();
                $('#lightbox-image').fadeIn(this.speed * 1.5,
                function() {
                    $.Lightbox.showImage(null, 4);
                });
                this.preloadNeighbours();
                if (this.handlers.show !== null)
                {
                    this.handlers.show(image);
                }
                break;
            case 4:
                var $title = $('#lightbox-caption-title').html(image.title || '');
                if (this.download_link) {
                    $('#saveLink').attr('href', $('#lightbox-image').attr('src'));
                    $('#saveLink').unbind().click(function() {
                        $.Lightbox.stopSlideshow();
                        window.open($(this).attr('href'));
                        return false;
                    });
                }
                delete $title;
                $('#lightbox-caption-seperator').html(image.description ? ': ': '');
                $('#lightbox-caption-description').html(image.description || ' ');
                if ($.Lightbox.slideshowEnabled) {
                    if ($.Lightbox.slideshowActive) {
                        $('#playLink').hide();
                        $('#pauseLink').show();
                    } else {
                        $('#playLink').show();
                        $('#pauseLink').hide();
                    }
                }
                if (this.images.length > 1)
                {
                    if (this.presentationMode === true) {
                        var myCurrentImageId = $.Lightbox.images.index;
                        var presentationNav = '';
                        for (var i = 0; i < ($.Lightbox.images.length); i++) {
                            if (i == myCurrentImageId) {
                                presentationNav += '<a class="act" href="#" id="pmi' + i + '" onClick="$.Lightbox.linkShowImageByNumber(' + i + ')">' + (i + 1) + '</a>';
                            } else {
                                presentationNav += '<a class="no" href="#" id="pmi' + i + '" onClick="$.Lightbox.linkShowImageByNumber(' + i + ')">' + (i + 1) + '</a>';
                            }
                        }
                        $('#lightbox-currentNumber').html(presentationNav);
                    } else {
                        $('#lightbox-currentNumber').html(this.text.image + ' ' + (this.images.index + 1) + ' ' + this.text.of + ' ' + this.images.length);
                    }
                } else
                {
                    $('#lightbox-currentNumber').html(' ');
                }
                $('#lightbox-imageBox').unbind('mouseover').mouseover(function() {
                    $('#lightbox-infoBox:not(:visible)').stop().slideDown('fast');
                });
                $('#lightbox-infoBox').unbind('mouseover').mouseover(function() {
                    $('#lightbox-infoFooter:not(:visible)').stop().slideDown('fast');
                });
                if (this.show_extended_info === true)
                {
                    $('#lightbox-imageBox').trigger('mouseover');
                    $('#lightbox-infoBox').trigger('mouseover');
                }
                else if (this.show_info === true)
                {
                    $('#lightbox-imageBox').trigger('mouseover');
                }
                $('#lightbox-nav-btnPrev, #lightbox-nav-btnNext').css({
                    'background': 'transparent url(' + this.files.images.blank + ') no-repeat'
                });
                if (!this.images.isFirst()) {
                    $('#lightbox-nav-btnPrev').show();
                }
                if (!this.images.isLast()) {
                    $('#lightbox-nav-btnNext').show();
                }
                $('#lightbox-nav').show();
                this.KeyboardNav_Enable();
                if ($.Lightbox.slideshowActive) {
                    $.Lightbox.triggerSlideshow();
                }
                break;
            default:
                $.console.error('Don\'t know what to do: ', image, step);
                return this.showImage(image, 1);
            }
            return true;
        },
        preloadNeighbours: function()
        {
            if (this.images.isSingle() || this.images.isEmpty())
            {
                return true;
            }
            var image = this.images.current();
            var index = this.images.index;
            if (!image) {
                return image;
            }
            var objNext;
            var prev = this.images.prev();
            if (prev) {
                objNext = new Image();
                objNext.src = prev.src;
            }
            this.images.setIndex(index);
            var next = this.images.next();
            if (next) {
                objNext = new Image();
                objNext.src = next.src;
            }
            this.images.setIndex(index);
        },
        KeyboardNav_Enable: function() {
            $(document).keydown(function(objEvent) {
                $.Lightbox.KeyboardNav_Action(objEvent);
            });
        },
        KeyboardNav_Disable: function() {
            $(document).unbind('keydown');
        },
        KeyboardNav_Action: function(objEvent) {
            objEvent = objEvent || window.event;
            var keycode = objEvent.keyCode;
            var escapeKey = objEvent.DOM_VK_ESCAPE || 27;
            var key = String.fromCharCode(keycode).toLowerCase();
            if (key === this.keys.close || keycode === escapeKey)
            {
                return $.Lightbox.finish();
            }
            if (key === this.keys.prev || keycode === 37)
            {
                $.Lightbox.stopSlideshow();
                if (!this.images.isFirst()) {
                    $.Lightbox.images.prev();
                    $.Lightbox.showImage();
                }
            }
            if (key === this.keys.next || keycode === 39)
            {
                $.Lightbox.stopSlideshow();
                if (!this.images.isLast()) {
                    $.Lightbox.images.next();
                    $.Lightbox.showImage();
                }
            }
            return true;
        },
        getPageScroll: function() {
            var xScroll,
            yScroll;
            if (self.pageYOffset)
            {
                yScroll = self.pageYOffset;
                xScroll = self.pageXOffset;
            } else if (document.documentElement && document.documentElement.scrollTop)
            {
                yScroll = document.documentElement.scrollTop;
                xScroll = document.documentElement.scrollLeft;
            } else if (document.body)
            {
                yScroll = document.body.scrollTop;
                xScroll = document.body.scrollLeft;
            }
            var arrayPageScroll = {
                'xScroll': xScroll,
                'yScroll': yScroll
            };
            return arrayPageScroll;
        },
        pause: function(ms) {
            var date = new Date();
            var curDate = null;
            do {
                curDate = new Date();
            }
            while (curDate - date < ms);
        }
    });
    if (typeof $.Lightbox === 'undefined')
    {
        $.Lightbox = new $.LightboxClass();
    }
})(jQuery);