/* ------------------------------------------------------------------------
	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($) {
  $.fn.prettyPopin = function(settings) {
    settings = jQuery.extend({
      modal : false, /* true/false */
      width : false, /* false/integer */
      height: false, /* false/integer */
      opacity: 0.5, /* value from 0 to 1 */
      animationSpeed: 'fast', /* slow/medium/fast/integer */
      followScroll: true, /* true/false */
      loader_path: '/images/loader.gif', /* path to your loading image */
      init: function(){}, /* callback called when opening the popin */
      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;

      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">Fermer</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()
        });
      };

      if(typeof settings.autoTrigger != 'undefined' && settings.autoTrigger)
      {
        buildoverlay();
        buildpopin();

        // Load the content
        $('.prettyPopin .prettyContent .prettyContent-container').html($(this).html());

        // 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);

        settings.init();
        displayPopin();

      }
      else
      {
        $(this).click(function(){
          buildoverlay();
          buildpopin();

          $.ajax({
            url: $(this).attr('href'),
            cache: false,
            success: 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);

            settings.init();
            displayPopin();              
            }
          });

//          $.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;
        });
      }
    });

    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);
