/* ------------------------------------------------------------------------
	Class: prettyPhoto
	Use: Lightbox clone for jQuery
	Author: Stephane Caron (http://www.no-margin-for-errors.com)
	Version: 2.2.2
------------------------------------------------------------------------- */

$.fn.prettyPhoto = function(settings) {
    // global Variables
    var isSet = false; /* Total position in the array */
    var setCount = 0; /* Total images in the set */
    var setPosition = 0; /* Position in the set */
    var arrayPosition = 0; /* Total position in the array */
    var hasTitle = false;
    var caller = 0;
    var doresize = true;
    var imagesArray = [];
    var firstImage;

    $(window).scroll(function() { _centerPicture(); });
    $(window).resize(function() { _centerPicture(); _resizeOverlay(); });
    $(document).keyup(function(e) {
        switch (e.keyCode) {
            case 37:
                if (setPosition == 1) return;
                changePicture('previous');
                break;
            case 39:
                if (setPosition == setCount) return;
                changePicture('next');
                break;
            case 27:
                close();
                break;
        };
    });


    settings = jQuery.extend({
        animationSpeed: 'normal', /* fast/slow/normal */
        padding: 40, /* padding for each side of the picture */
        opacity: 0.35, /* Value betwee 0 and 1 */
        showTitle: true, /* true/false */
        allowresize: true, /* true/false */
        counter_separator_label: '/' /* Teh separator for the gallery counter 1 "of" 2 */
    }, settings);

    $(this).each(function() {
        imagesArray[imagesArray.length] = this;
        $(this).bind('click', function() {
            open(this); return false;
        });
    });




    function open(el) {
        caller = $(el);

        // Find out if the picture is part of a set
        theRel = $(caller).attr('rel');
        galleryRegExp = /\[(?:.*)\]/;
        theGallery = galleryRegExp.exec(theRel);

        // Find out the type of content
        contentType = "image";
        if ($(caller).attr('href').indexOf('.swf') > 0) { hasTitle = false; contentType = 'flash'; };

        // Calculate the number of items in the set, and the position of the clicked picture.
        isSet = false;
        setCount = 0;
        for (i = 0; i < imagesArray.length; i++) {
            if ($(imagesArray[i]).attr('rel').indexOf(theGallery) != -1) {
                setCount++;
                if (setCount > 1) isSet = true;

                if ($(imagesArray[i]).attr('href') == $(el).attr('href')) {
                    setPosition = setCount;
                    arrayPosition = i;
                };
            };
        };

        _buildOverlay(isSet);

        // Display the current position
        $('div.pictureHolder p.currentTextHolder').text(setPosition + settings.counter_separator_label + setCount);

        // Position the picture in the center of the viewing area
        _centerPicture();

        $('div.pictureHolder #fullResImageContainer').hide();
        $('.loaderIcon').show();

        // Display the correct type of information
        (contentType == 'image') ? _preload() : _writeFlash();
    };

    showimage = function(width, height, containerWidth, containerHeight, contentHeight, contentWidth, resized) {
        $('.loaderIcon').hide();
        var scrollPos = _getScroll();

        if ($.browser.opera) {
            windowHeight = window.innerHeight;
            windowWidth = window.innerWidth;
        } else {
            windowHeight = $(window).height();
            windowWidth = $(window).width();
        };

        $('div.pictureHolder .content').animate({ 'height': contentHeight, 'width': containerWidth }, settings.animationSpeed);

        projectedTop = scrollPos['scrollTop'] + ((windowHeight / 2) - (containerHeight / 2));
        if (projectedTop < 0) projectedTop = 0 + $('div.prettyPhotoTitle').height();

        // Resize the holder
        $('div.pictureHolder').animate({
            'top': projectedTop,
            'left': ((windowWidth / 2) - (containerWidth / 2)),
            'width': containerWidth
        }, settings.animationSpeed, function() {
            $('#fullResImage').attr({
                'width': width,
                'height': height
            });

            $('div.pictureHolder').width(containerWidth);
            $('div.pictureHolder .hoverContainer').height(height).width(width);

            // Show the nav elements
            _shownav();

            // Fade the new image
            $('div.pictureHolder #fullResImageContainer').fadeIn(settings.animationSpeed);

            // Fade the resizing link if the image is resized
            if (resized) $('a.expand,a.contract').fadeIn(settings.animationSpeed);
        });
    };

    function changePicture(direction) {
        if (direction == 'previous') {
            arrayPosition--;
            setPosition--;
        } else {
            arrayPosition++;
            setPosition++;
        };

        // Allow the resizing of the images
        if (!doresize) doresize = true;

        // Fade out the current picture
        $('div.pictureHolder .hoverContainer,div.pictureHolder .details').fadeOut(settings.animationSpeed);
        $('div.pictureHolder #fullResImageContainer').fadeOut(settings.animationSpeed, function() {
            $('.loaderIcon').show();

            // Preload the image
            _preload();
        });

        _hideTitle();
        $('a.expand,a.contract').fadeOut(settings.animationSpeed, function() {
            $(this).removeClass('contract').addClass('expand');
        });
    };

    function close() {
        $('div.pictureHolder,div.prettyPhotoTitle').fadeOut(settings.animationSpeed, function() {
            $('div.prettyPhotoOverlay').fadeOut(settings.animationSpeed, function() {
                $('div.prettyPhotoOverlay,div.pictureHolder,div.prettyPhotoTitle').remove();

                // To fix the bug with IE select boxes
                if ($.browser.msie && $.browser.version == 6) {
                    $('select').css('visibility', 'visible');
                };
            });
        });
    };

    function _checkPosition() {
        // If at the end, hide the next link
        if (setPosition == setCount) {
            $('div.pictureHolder a.next').css('visibility', 'hidden');
            $('div.pictureHolder a.arrow_next').addClass('disabled').unbind('click');
        } else {
            $('div.pictureHolder a.next').css('visibility', 'visible');
            $('div.pictureHolder a.arrow_next.disabled').removeClass('disabled').bind('click', function() {
                changePicture('next');
                return false;
            });
        };

        // If at the beginning, hide the previous link
        if (setPosition == 1) {
            $('div.pictureHolder a.previous').css('visibility', 'hidden');
            $('div.pictureHolder a.arrow_previous').addClass('disabled').unbind('click');
        } else {
            $('div.pictureHolder a.previous').css('visibility', 'visible');
            $('div.pictureHolder a.arrow_previous.disabled').removeClass('disabled').bind('click', function() {
                changePicture('previous');
                return false;
            });
        };

        // Change the current picture text
        $('div.pictureHolder p.currentTextHolder').text(setPosition + settings.counter_separator_label + setCount);

        (isSet) ? $c = $(imagesArray[arrayPosition]) : $c = $(caller);

        if ($c.attr('title')) {
            $('div.pictureHolder .description').show().html(unescape($c.attr('title')));
        } else {
            $('div.pictureHolder .description').hide().text('');
        };

        if ($c.find('img').attr('alt') && settings.showTitle) {
            hasTitle = true;
            $('div.prettyPhotoTitle .prettyPhotoTitleContent').html(unescape($c.find('img').attr('alt')));
        } else {
            hasTitle = false;
        };
    };

    function _fitToViewport(width, height) {
        hasBeenResized = false;

        $('div.pictureHolder .details').width(width); /* To have the correct height */
        $('div.pictureHolder .details p.description').width(width - parseFloat($('div.pictureHolder a.close').css('width'))); /* So it doesn't overlap the button */

        // Get the container size, to resize the holder to the right dimensions
        contentHeight = height + parseFloat($('div.pictureHolder .details').height()) + parseFloat($('div.pictureHolder .details').css('margin-top')) + parseFloat($('div.pictureHolder .details').css('margin-bottom'));
        contentWidth = width;
        containerHeight = height + parseFloat($('div.prettyPhotoTitle').height()) + parseFloat($('div.pictureHolder .top').height()) + parseFloat($('div.pictureHolder .bottom').height());
        containerWidth = width + settings.padding;

        // Define them in case there's no resize needed
        imageWidth = width;
        imageHeight = height;

        if ($.browser.opera) {
            windowHeight = window.innerHeight;
            windowWidth = window.innerWidth;
        } else {
            windowHeight = $(window).height();
            windowWidth = $(window).width();
        };

        if (((containerWidth > windowWidth) || (containerHeight > windowHeight)) && doresize && settings.allowresize) {
            hasBeenResized = true;

            if ((containerWidth > windowWidth) && (containerHeight > windowHeight)) {
                // Get the original geometry and calculate scales
                var xscale = (containerWidth + 200) / windowWidth;
                var yscale = (containerHeight + 200) / windowHeight;
            } else {
                // Get the original geometry and calculate scales
                var xscale = windowWidth / containerWidth;
                var yscale = windowHeight / containerHeight;
            }

            // Recalculate new size with default ratio
            if (yscale > xscale) {
                imageWidth = Math.round(width * (1 / yscale));
                imageHeight = Math.round(height * (1 / yscale));
            } else {
                imageWidth = Math.round(width * (1 / xscale));
                imageHeight = Math.round(height * (1 / xscale));
            };

            // Define the new dimensions
            contentHeight = imageHeight + parseFloat($('div.pictureHolder .details').height()) + parseFloat($('div.pictureHolder .details').css('margin-top')) + parseFloat($('div.pictureHolder .details').css('margin-bottom'));
            contentWidth = imageWidth;
            containerHeight = imageHeight + parseFloat($('div.prettyPhotoTitle').height()) + parseFloat($('div.pictureHolder .top').height()) + parseFloat($('div.pictureHolder .bottom').height());
            containerWidth = imageWidth + settings.padding;

            $('div.pictureHolder .details').width(contentWidth); /* To have the correct height */
            $('div.pictureHolder .details p.description').width(contentWidth - parseFloat($('div.pictureHolder a.close').css('width'))); /* So it doesn't overlap the button */
        };

        return {
            width: imageWidth,
            height: imageHeight,
            containerHeight: containerHeight,
            containerWidth: containerWidth,
            contentHeight: contentHeight,
            contentWidth: contentWidth,
            resized: hasBeenResized
        };
    };

    function _centerPicture() {
        //Make sure the gallery is open
        if ($('div.pictureHolder').size() > 0) {

            var scrollPos = _getScroll();

            if ($.browser.opera) {
                windowHeight = window.innerHeight;
                windowWidth = window.innerWidth;
            } else {
                windowHeight = $(window).height();
                windowWidth = $(window).width();
            };

            if (doresize) {
                projectedTop = (windowHeight / 2) + scrollPos['scrollTop'] - ($('div.pictureHolder').height() / 2);
                if (projectedTop < 0) projectedTop = 0 + $('div.prettyPhotoTitle').height();

                $('div.pictureHolder').css({
                    'top': projectedTop,
                    'left': (windowWidth / 2) + scrollPos['scrollLeft'] - ($('div.pictureHolder').width() / 2)
                });

                $('div.prettyPhotoTitle').css({
                    'top': $('div.pictureHolder').offset().top - $('div.prettyPhotoTitle').height(),
                    'left': $('div.pictureHolder').offset().left + (settings.padding / 2)
                });
            };
        };
    };

    function _shownav() {
        if (isSet) $('div.pictureHolder .hoverContainer').fadeIn(settings.animationSpeed);
        $('div.pictureHolder .details').fadeIn(settings.animationSpeed);

        _showTitle();
    };

    function _showTitle() {
        if (settings.showTitle && hasTitle) {
            $('div.prettyPhotoTitle').css({
                'top': $('div.pictureHolder').offset().top,
                'left': $('div.pictureHolder').offset().left + (settings.padding / 2),
                'display': 'block'
            });

            $('div.prettyPhotoTitle div.prettyPhotoTitleContent').css('width', 'auto');

            if ($('div.prettyPhotoTitle').width() > $('div.pictureHolder').width()) {
                $('div.prettyPhotoTitle div.prettyPhotoTitleContent').css('width', $('div.pictureHolder').width() - (settings.padding * 2));
            } else {
                $('div.prettyPhotoTitle div.prettyPhotoTitleContent').css('width', '');
            };

            $('div.prettyPhotoTitle').animate({ 'top': ($('div.pictureHolder').offset().top - 22) }, settings.animationSpeed);
        };
    };

    function _hideTitle() {
        $('div.prettyPhotoTitle').animate({ 'top': ($('div.pictureHolder').offset().top) }, settings.animationSpeed, function() { $(this).css('display', 'none'); });
    };

    function _preload() {
        // Hide the next/previous links if on first or last images.
        _checkPosition();

        // Set the new image
        imgPreloader = new Image();

        // Preload the neighbour images
        nextImage = new Image();
        if (isSet) nextImage.src = $(imagesArray[arrayPosition + 1]).attr('href');
        prevImage = new Image();
        if (isSet && imagesArray[arrayPosition - 1]) prevImage.src = $(imagesArray[arrayPosition - 1]).attr('href');

        $('div.pictureHolder .content').css('overflow', 'hidden');

        if (isSet) {
            $('div.pictureHolder #fullResImage').attr('src', $(imagesArray[arrayPosition]).attr('href'));
        } else {
            $('div.pictureHolder #fullResImage').attr('src', $(caller).attr('href'));
        };

        imgPreloader.onload = function() {
            var correctSizes = _fitToViewport(imgPreloader.width, imgPreloader.height);
            imgPreloader.width = correctSizes['width'];
            imgPreloader.height = correctSizes['height'];

            // Need that small delay for the anim to be nice
            setTimeout('showimage(imgPreloader.width,imgPreloader.height,' + correctSizes["containerWidth"] + ',' + correctSizes["containerHeight"] + ',' + correctSizes["contentHeight"] + ',' + correctSizes["contentWidth"] + ',' + correctSizes["resized"] + ')', 500);
        };

        (isSet) ? imgPreloader.src = $(imagesArray[arrayPosition]).attr('href') : imgPreloader.src = $(caller).attr('href');
    };

    function _getScroll() {
        scrollTop = window.pageYOffset || document.documentElement.scrollTop || 0;
        scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || 0;
        return { scrollTop: scrollTop, scrollLeft: scrollLeft };
    };

    function _resizeOverlay() {
        $('div.prettyPhotoOverlay').css({
            'height': $(document).height(),
            'width': $(window).width()
        });
    };

    function _writeFlash() {
        flashParams = $(caller).attr('rel').split(';');
        $(flashParams).each(function(i) {
            // Define the width and height
            if (flashParams[i].indexOf('width') >= 0) flashWidth = flashParams[i].substring(flashParams[i].indexOf('width') + 6, flashParams[i].length);
            if (flashParams[i].indexOf('height') >= 0) flashHeight = flashParams[i].substring(flashParams[i].indexOf('height') + 7, flashParams[i].length);
            if (flashParams[i].indexOf('flashvars') >= 0) flashVars = flashParams[i].substring(flashParams[i].indexOf('flashvars') + 10, flashParams[i].length);
        });

        $('.pictureHolder #fullResImageContainer').append('<embed width="' + flashWidth + '" height="' + flashHeight + '" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" wmode="opaque" name="prettyFlash" flashvars="' + flashVars + '" allowscriptaccess="always" bgcolor="#FFFFFF" quality="high" src="' + $(caller).attr('href') + '"/>');
        $('#fullResImage').hide();

        contentHeight = parseFloat(flashHeight) + parseFloat($('div.pictureHolder .details').height()) + parseFloat($('div.pictureHolder .details').css('margin-top')) + parseFloat($('div.pictureHolder .details').css('margin-bottom'));
        contentWidth = parseFloat(flashWidth) + parseFloat($('div.pictureHolder .details').width()) + parseFloat($('div.pictureHolder .details').css('margin-left')) + parseFloat($('div.pictureHolder .details').css('margin-right'));
        containerHeight = contentHeight + parseFloat($('div.pictureHolder .top').height()) + parseFloat($('div.pictureHolder .bottom').height());
        containerWidth = parseFloat(flashWidth) + parseFloat($('div.pictureHolder .content').css("padding-left")) + parseFloat($('div.pictureHolder .content').css("padding-right")) + settings.padding;

        setTimeout('showimage(' + flashWidth + ',' + flashHeight + ',' + containerWidth + ',' + containerHeight + ',' + contentHeight + ',' + contentWidth + ')', 500);
    };

    function _buildOverlay() {

        // Build the background overlay div
        backgroundDiv = "<div class='prettyPhotoOverlay'></div>";
        $('body').append(backgroundDiv);
        $('div.prettyPhotoOverlay').css('height', $(document).height()).bind('click', function() {
            close();
        });

        // Basic HTML for the picture holder
        pictureHolder = '<div class="pictureHolder"><div class="top"><div class="left"></div><div class="middle"></div><div class="right"></div></div><div class="content"><a href="#" class="expand" title="Expand the image">Expand</a><div class="loaderIcon"></div><div class="hoverContainer"><a class="next" href="#">next</a><a class="previous" href="#">previous</a></div><div id="fullResImageContainer"><img id="fullResImage" src="" /></div><div class="details clearfix"><a class="close" href="#">Close</a><p class="description"></p><div class="nav"><a href="#" class="arrow_previous">Previous</a><p class="currentTextHolder">0' + settings.counter_separator_label + '0</p><a href="#" class="arrow_next">Next</a></div></div></div><div class="bottom"><div class="left"></div><div class="middle"></div><div class="right"></div></div></div>';

        // Basic html for the title holder
        titleHolder = '<div class="prettyPhotoTitle"><div class="prettyPhotoTitleLeft"></div><div class="prettyPhotoTitleContent"></div><div class="prettyPhotoTitleRight"></div></div>';

        $('body').append(pictureHolder).append(titleHolder);

        $('.pictureHolder,.titleHolder').css({ 'opacity': 0 });
        $('a.close').bind('click', function() { close(); return false; });
        $('a.expand').bind('click', function() {

            // Expand the image
            if ($(this).hasClass('expand')) {
                $(this).removeClass('expand').addClass('contract');
                doresize = false;
            } else {
                $(this).removeClass('contract').addClass('expand');
                doresize = true;
            };

            _hideTitle();
            $('div.pictureHolder .hoverContainer,div.pictureHolder #fullResImageContainer').fadeOut(settings.animationSpeed);
            $('div.pictureHolder .details').fadeOut(settings.animationSpeed, function() {
                _preload();
            });

            return false;
        });

        $('.pictureHolder .previous,.pictureHolder .arrow_previous').bind('click', function() {
            changePicture('previous');
            return false;
        });

        $('.pictureHolder .next,.pictureHolder .arrow_next').bind('click', function() {
            changePicture('next');
            return false;
        });

        $('.hoverContainer').css({
            'margin-left': settings.padding / 2
        });

        // If it's not a set, hide the links
        if (!isSet) {
            $('.hoverContainer,.nav').hide();
        };


        // To fix the bug with IE select boxes
        if ($.browser.msie && $.browser.version == 6) {
            $('select').css('visibility', 'hidden');
        };

        // Then fade it in
        $('div.prettyPhotoOverlay').css('opacity', 0).fadeTo(settings.animationSpeed, settings.opacity, function() {
            $('div.pictureHolder').css('opacity', 0).fadeIn(settings.animationSpeed, function() {
                // To fix an IE bug
                $('div.pictureHolder').attr('style', 'left:' + $('div.pictureHolder').css('left') + ';top:' + $('div.pictureHolder').css('top') + ';');
            });
        });
    };


    //This is a hack to launch the first image
    if (imagesArray[0]) {
        open(imagesArray[0]); return false;
    }
};
