/* ------------------------------------------------------------------------
	Class: prettyPopin
	Use: Alternative to popups
	Author: Stephane Caron (http://www.no-margin-for-errors.com)
	Version: 1.3
------------------------------------------------------------------------- */

var _followScroll = false;
var _readyBound = false;

(function($) {
    /**
     * @author Victor Vargas
     **/
    $.prettyPopinOpen = function(link){
        var settings = jQuery.extend({
            modal : false, /* true/false */
            width : false, /* false/integer */
            height: false, /* false/integer */
            opacity: 0.9, /* value from 0 to 1 */
            animationSpeed: 'fast', /* slow/medium/fast/integer */
            followScroll: true, /* true/false */
            loader_path: 'images/prettyPopin/loader.gif', /* path to your loading image */
            callback: function(){} /* callback called when closing the popin */
        }, settings);

        function bindReady(){ // To bind them only once
            if(_readyBound) return;
            _readyBound = true;
            $(window).scroll(function(){
                _centerPopin();
            });
            $(window).resize(function(){
                _centerPopin();
            });
        };
        bindReady();

        // Overlay
        $('body').append('<div id="overlay"></div>');

        // Set the proper height
        $('#overlay').css('height',$(document).height());

        // Fade it in
        $('#overlay').css('opacity',0).fadeTo(settings.animationSpeed,settings.opacity);

        if(!settings.modal){
            $('#overlay').click(function(){
                closeOverlay();
            });
        };

        // Buildpopin
        $('body').append('<div class="prettyPopin"><a href="#" id="b_close" rel="close">Close</a><div class="prettyContent"><img src="'+settings.loader_path+'" alt="Loading" class="loader" /><div class="prettyContent-container"></div></div></div>');
        $c = $('.prettyPopin .prettyContent .prettyContent-container'); // The content container

        $('.prettyPopin a[rel=close]:eq(0)').click(function(){
            closeOverlay();
            return false;
        });

        var scrollPos = _getScroll();

        // Show the popin
        $('.prettyPopin').width(45).height(45).css({
            'top': ($(window).height()/2) + scrollPos['scrollTop'],
            'left': ($(window).width()/2) + scrollPos['scrollLeft']
        }).hide().fadeIn(settings.animationSpeed);
        

        // Load the content
        $.get(link,function(responseText){
            $('.prettyPopin .prettyContent .prettyContent-container').html(responseText);

            // This block of code is used to calculate the width/height of the popin
            popinWidth = settings.width || $('.prettyPopin .prettyContent .prettyContent-container').width() + parseFloat($('.prettyPopin .prettyContent .prettyContent-container').css('padding-left')) + parseFloat($('.prettyPopin .prettyContent .prettyContent-container').css('padding-right'));
            $('.prettyPopin').width(popinWidth);
            popinHeight = settings.height || $('.prettyPopin .prettyContent .prettyContent-container').height() + parseFloat($('.prettyPopin .prettyContent .prettyContent-container').css('padding-top')) + parseFloat($('.prettyPopin .prettyContent .prettyContent-container').css('padding-bottom'));
            $('.prettyPopin').height(popinHeight);

            // Now reset the width/height
            $('.prettyPopin').height(45).width(45);

            displayPopin();

            function displayPopin() {
                var scrollPos = _getScroll();

                projectedTop = ($(window).height()/2) + scrollPos['scrollTop'] - (popinHeight/2);
                if(projectedTop < 0) {
                    projectedTop = 10;
                    _followScroll = false;
                }else{
                    _followScroll = settings.followScroll;
                };

                $('.prettyPopin').animate({
                    'top': projectedTop,
                    'left': ($(window).width()/2) + scrollPos['scrollLeft'] - (popinWidth/2),
                    'width' : popinWidth,
                    'height' : popinHeight
                },settings.animationSpeed, function(){
                    displayContent();
                });
            };            

            function displayContent() {
                $c.parent().find('.loader').hide();
                $c.parent().parent().find('#b_close').show();
                $c.fadeIn(function(){
                    // Focus on the first form input if there's one
                    $(this).find('input[type=text]:first').trigger('focus');

                    // Check for paging
                    $('.prettyPopin a[rel=internal]').click(function(){
                        $link = $(this);

                        // Fade out the current content
                        $c.fadeOut(function(){
                            $c.parent().find('.loader').show();

                            // Submit the form
                            $.get($link.attr('href'),function(responseText){
                                // Replace the content
                                $c.html(responseText);

                                _refreshContent($c);
                            });
                        });
                        return false;
                    });


                    // Submit the form in ajax
                    $('.prettyPopin form').bind('submit',function(){
                        $theForm = $(this);
                        // Fade out the current content
                        $c.fadeOut(function(){
                            $c.parent().find('.loader').show();

                            // Submit the form
                            $.post($theForm.attr('action'), $theForm.serialize(),function(responseText){
                                // Replace the content
                                $c.html(responseText);

                                _refreshContent($c);
                            });
                        });
                        return false;
                    });
                });
                $('.prettyPopin a[rel=close]:gt(0)').click(function(){
                    closeOverlay();
                    return false;
                });
            };
        });

        function closeOverlay(){
            return false;
        }

        function _getScroll(){
            scrollTop = window.pageYOffset || document.documentElement.scrollTop || 0;
            scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || 0;
            return {
                scrollTop:scrollTop,
                scrollLeft:scrollLeft
            };
        };
        return false;
    }
    /**
     * -------
     **/

    $.fn.prettyPopin = function(settings) {
        settings = jQuery.extend({
            modal : false, /* true/false */
            width : false, /* false/integer */
            height: false, /* false/integer */
            opacity: 0.9, /* value from 0 to 1 */
            animationSpeed: 'fast', /* slow/medium/fast/integer */
            followScroll: true, /* true/false */
            loader_path: 'images/prettyPopin/loader.gif', /* path to your loading image */
            callback: function(){} /* callback called when closing the popin */
        }, settings);

        function bindReady(){ // To bind them only once
            if(_readyBound) return;
            _readyBound = true;
            $(window).scroll(function(){
                _centerPopin();
            });
            $(window).resize(function(){
                _centerPopin();
            });
        };
        bindReady();
		
        return this.each(function(){
            var popinWidth;
            var popinHeight;
            var $c;
		
            $(this).click(function(){
                buildoverlay();
                buildpopin();
			
                // Load the content
                $.get($(this).attr('href'),function(responseText){
                    $('.prettyPopin .prettyContent .prettyContent-container').html(responseText);
				
                    // This block of code is used to calculate the width/height of the popin
                    popinWidth = settings.width || $('.prettyPopin .prettyContent .prettyContent-container').width() + parseFloat($('.prettyPopin .prettyContent .prettyContent-container').css('padding-left')) + parseFloat($('.prettyPopin .prettyContent .prettyContent-container').css('padding-right'));
                    $('.prettyPopin').width(popinWidth);
                    popinHeight = settings.height || $('.prettyPopin .prettyContent .prettyContent-container').height() + parseFloat($('.prettyPopin .prettyContent .prettyContent-container').css('padding-top')) + parseFloat($('.prettyPopin .prettyContent .prettyContent-container').css('padding-bottom'));
                    $('.prettyPopin').height(popinHeight);
				
                    // Now reset the width/height
                    $('.prettyPopin').height(45).width(45);
				
                    displayPopin();
                });
                return false;
            });

            var displayPopin = function() {
                var scrollPos = _getScroll();

                projectedTop = ($(window).height()/2) + scrollPos['scrollTop'] - (popinHeight/2);
                if(projectedTop < 0) {
                    projectedTop = 10;
                    _followScroll = false;
                }else{
                    _followScroll = settings.followScroll;
                };

                $('.prettyPopin').animate({
                    'top': projectedTop,
                    'left': ($(window).width()/2) + scrollPos['scrollLeft'] - (popinWidth/2),
                    'width' : popinWidth,
                    'height' : popinHeight
                },settings.animationSpeed, function(){
                    displayContent();
                });
            };
		
            var buildpopin = function() {
                $('body').append('<div class="prettyPopin"><a href="#" id="b_close" rel="close">Close</a><div class="prettyContent"><img src="'+settings.loader_path+'" alt="Loading" class="loader" /><div class="prettyContent-container"></div></div></div>');
                $c = $('.prettyPopin .prettyContent .prettyContent-container'); // The content container
			
                $('.prettyPopin a[rel=close]:eq(0)').click(function(){
                    closeOverlay();
                    return false;
                });
			
                var scrollPos = _getScroll();
			
                // Show the popin
                $('.prettyPopin').width(45).height(45).css({
                    'top': ($(window).height()/2) + scrollPos['scrollTop'],
                    'left': ($(window).width()/2) + scrollPos['scrollLeft']
                }).hide().fadeIn(settings.animationSpeed);
            };
		
            var buildoverlay = function() {
                $('body').append('<div id="overlay"></div>');
			
                // Set the proper height
                $('#overlay').css('height',$(document).height());
			
                // Fade it in
                $('#overlay').css('opacity',0).fadeTo(settings.animationSpeed,settings.opacity);
			
                if(!settings.modal){
                    $('#overlay').click(function(){
                        closeOverlay();
                    });
                };
            };
		
            var displayContent = function() {
                $c.parent().find('.loader').hide();
                $c.parent().parent().find('#b_close').show();
                $c.fadeIn(function(){
                    // Focus on the first form input if there's one
                    $(this).find('input[type=text]:first').trigger('focus');

                    // Check for paging
                    $('.prettyPopin a[rel=internal]').click(function(){
                        $link = $(this);

                        // Fade out the current content
                        $c.fadeOut(function(){
                            $c.parent().find('.loader').show();

                            // Submit the form
                            $.get($link.attr('href'),function(responseText){
                                // Replace the content
                                $c.html(responseText);

                                _refreshContent($c);
                            });
                        });
                        return false;
                    });
				

                    // Submit the form in ajax
                    $('.prettyPopin form').bind('submit',function(){
                        $theForm = $(this);
                        // Fade out the current content
                        $c.fadeOut(function(){
                            $c.parent().find('.loader').show();
						
                            // Submit the form
                            $.post($theForm.attr('action'), $theForm.serialize(),function(responseText){
                                // Replace the content
                                $c.html(responseText);

                                _refreshContent($c);
                            });
                        });
                        return false;
                    });
                });
                $('.prettyPopin a[rel=close]:gt(0)').click(function(){
                    closeOverlay();
                    return false;
                });
            };
	
            var _refreshContent = function(){
                var scrollPos = _getScroll();

                if(!settings.width)	popinWidth = $c.width() + parseFloat($c.css('padding-left')) + parseFloat($c.css('padding-right'));
                if(!settings.height) popinHeight = $c.height() + parseFloat($c.css('padding-top')) + parseFloat($c.css('padding-bottom'));

                projectedTop = ($(window).height()/2) + scrollPos['scrollTop'] - (popinHeight/2);
                if(projectedTop < 0) {
                    projectedTop = 10;
                    _followScroll = false;
                }else{
                    _followScroll = settings.followScroll;
                };

                $('.prettyPopin').animate({
                    'top': projectedTop,
                    'left': ($(window).width()/2) + scrollPos['scrollLeft'] - (popinWidth/2),
                    'width' : popinWidth,
                    'height' : popinHeight
                }, settings.animationSpeed,function(){
                    displayContent();
                });
            };
		
            var closeOverlay = function() {
                $('#overlay').fadeOut(settings.animationSpeed,function(){
                    $(this).remove();
                });
                $('.prettyPopin').fadeOut(settings.animationSpeed,function(){
                    $(this).remove();
                    settings.callback()
                });
            };
        });
	
        function _centerPopin(){
            if(!_followScroll) return;

            // Make sure the popin exist
            if(!$('.prettyPopin')) return;
			
            var scrollPos = _getScroll();

            if($.browser.opera) {
                windowHeight = window.innerHeight;
                windowWidth = window.innerWidth;
            }else{
                windowHeight = $(window).height();
                windowWidth = $(window).width();
            };

            projectedTop = ($(window).height()/2) + scrollPos['scrollTop'] - ($('.prettyPopin').height()/2);
            if(projectedTop < 0) {
                projectedTop = 10;
                _followScroll = false;
            }else{
                _followScroll = true;
            };

            $('.prettyPopin').css({
                'top': projectedTop,
                'left': ($(window).width()/2) + scrollPos['scrollLeft'] - ($('.prettyPopin').width()/2)
            });
        };
	
        function _getScroll(){
            scrollTop = window.pageYOffset || document.documentElement.scrollTop || 0;
            scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || 0;
            return {
                scrollTop:scrollTop,
                scrollLeft:scrollLeft
            };
        };
    };
})(jQuery);