/**
 * @author  Julien Lirochon <julien@kolana-studio.com>
 * @since   2010-12-09
 *
 * jQuery('div.pager a').mrLoad({
 *   'replaceSelector': '#videos',            // jQuery('#videos') will be replaced by ajax data after successful loading
 *   'loaderSelector':  '#videos ul.gallery', // jQuery('#videos ul.gallery') will be masked by a loader during loading
 *   'loaderClass':     'loader horizontal',  // injected loader will have class="loader horizontal" attribute,
 *   'loaderMessage':   'loading...',         // injected loader will contains 'loading...' message
 *   'errorMessage':    'oooops'
 * });
 *
 */
(function($) {
  $.fn.mrLoad = function(userOptions) {

    var methods = {
      centerLoader: function(hiddenElement, loaderWrapper) {
        
        var containerHeight   = hiddenElement.height(),
            containerWidth    = hiddenElement.width(),
            containerPosition = hiddenElement.position(),
            loader            = loaderWrapper.children();

        loaderWrapper.height(containerHeight)
                     .width(containerWidth)
                     .css('top', containerPosition.top + 'px');

        var loaderTop = ((containerHeight - loader.outerHeight()) / 2);
        loader.css('top', loaderTop + 'px');
      }
    };

    var defaultOptions = {
      'loaderClass': 'loader',
      'loaderMessage': ''
    };
    var options = $.extend({}, defaultOptions, userOptions);

    return this.each(function(){

      if (undefined != options.replaceSelector) {

        var url = $(this).attr('href');
        $(this).click(function(event){

          event.preventDefault();
          if ($(options.replaceSelector).data('loading')) {
            return;
          }

          // inject loader
          if (options.loaderSelector != undefined) {
            $(options.loaderSelector).css('transparency', '');
            var loaderWrapper = $('<div class="loader_wrapper"><div class="'+options.loaderClass+'">'+options.loaderMessage+'</div></div>');
            $(options.loaderSelector).after(loaderWrapper);
            methods.centerLoader($(options.loaderSelector), loaderWrapper);
          }

          // disable click
          $(options.replaceSelector).data('loading', true);


          $.ajax({
            'url': url,
            'dataType': 'html',
            'success': function(data, textStatus, XMLHttpRequest){
              $(options.replaceSelector).replaceWith(data);
              $(options.replaceSelector).removeData('loading');
            },
            'error': function(XMLHttpRequest, textStatus, errorThrown){
              // remove loader
              if (loaderWrapper != undefined) {
                loaderWrapper.remove();
                $(options.replaceSelector).removeData('loading');
              }
              // show container again
              $(options.loaderSelector).show();
              // display error message
              if (options.errorMessage != undefined) {
                jQuery.notice.display(options.errorMessage, 'error');
              }
            }
          });
        });
      }

    });
  };
})(jQuery);
