(function($)
{
    $.fn.gallery = function(options)
    {
        
        return this.each(function()
        {
            
            var oThisGallery = $(this);
            var oZoomImageLink = oThisGallery.find('.zoomImageLink');
            var oZoomImg = oThisGallery.find('.zoomImg');
            var oZoomImageLens = oThisGallery.find('.zoomImageLens');
            var oThumbList = oThisGallery.find('.thumbList');
            var oThumbListLinks = oThisGallery.find('.thumbList a');
            var oThumbListCarousel = oThisGallery.find('.thumbList .container');
            var sGalleryId = oThisGallery.attr('id');
            
            var running = false
            var oFancyBoxOptions = {};
            var aItemArray = [];
            var sImage = '';
            
            // thumbs init
            oThumbListLinks
                .each(function()
                {
                    aRelArray = getRelAttr($(this).attr('rel'));
                    aItemArray.push({href: aRelArray[2], title: aRelArray[3].replace(/\'/g, "")});
                })
                .click(function()
                {
                    doImageTransition(this);
                    return false;
                });

            // fancybox
            oFancyBoxOptions = {
                origSelector: '#' + sGalleryId + ' .zoomImageLink', callbackOnShow: callbackTransition, 
                itemArray: aItemArray, padding: 0, hideOnContentClick: true, 
                zoomSpeedIn: 400, zoomSpeedOut: 400, 
                overlayShow: true, overlayOpacity: 0.01, zoomOpacity: true, 'easingIn': 'easeOutQuad', 'easingOut': 'easeOutQuad'};
            oZoomImageLink.fancybox(oFancyBoxOptions);
            
            // gallery thumblist
            oThumbListCarousel.jCarouselLite(
            {
                btnNext: '#' + sGalleryId + ' .nextButton',
                btnPrev: '#' + sGalleryId + ' .prevButton',
                easing: "easeInOutQuint",
                speed: 800,
                circular: false,
                visible: 5,
                scroll: 5
            });
            
            function doImageTransition(oCurrentThumbnail)
            {
            
                var sImage = $(oCurrentThumbnail).attr('href');
            
                if(oZoomImg.attr('src') == sImage)
                {
                    return false;
                }
            
                aRelArray = getRelAttr($(oCurrentThumbnail).attr('rel'));
                iXSize = aRelArray[0];
                iYSize = aRelArray[1];
                zoomLink = aRelArray[2];
                zoomTitle = aRelArray[3].replace(/\'/g, "");
            
                if(zoomLink) 
                {
                    oZoomImageLink.attr('href', zoomLink).fancybox(oFancyBoxOptions).attr('title', zoomTitle);
                    oZoomImageLens.show();
                }
                else
                {
                    oZoomImageLink.unbind('click').click(function(){return false;});
                    oZoomImageLens.hide();
                }
                
                var eImage = document.createElement('img');
                oZoomImg.fadeOut(100, function()
                {
                    $(eImage).attr('src', sImage);
                });
                eImage.onload = function()
                {
                    oZoomImageLink.animate(
                        {width: iXSize + 'px', height: iYSize + 'px'}, 
                        function()
                        {
                            oZoomImg
                                .css({width: iXSize + 'px', height: iYSize + 'px'})
                                .attr('src', sImage).fadeIn(500);

                            if(oThisGallery.parent().attr('class') == 'section')
                            {
                                $.fn.glider.updateHeight(oThisGallery.parent());
                            }   
                        }
                    );
                }
            }
            
            function callbackTransition(iCurrentItem)
            {
                if(oFancyBoxOptions.itemArray[iCurrentItem])
                {
                    $(oThumbList).find("a[rel*='" + oFancyBoxOptions.itemArray[iCurrentItem].href + "']").each(function()
                    {
                        doImageTransition(this);
                    });
                }
            }
            
            function getRelAttr(sAttr)
            {
                sAttr = sAttr.replace(/[\r\n|\s]/g, ' ');
                var sTransition = /^transition\[(.+)\]$/.exec(sAttr)[1];
                aRelArray = sTransition.split(",");
                return aRelArray;
            }
        });
    };
})(jQuery);