/*
 * jQuery Backstretch
 * Version custom 1.1.2 & 1.2.0beta merged by Tom Schoutens
 * http://srobbin.com/jquery-plugins/jquery-backstretch/
 *
 * Add a dynamically-resized background image to the page
 *
 * Copyright (c) 2011 Scott Robbin (srobbin.com)
 * Dual licensed under the MIT and GPL licenses.
*/

(function($)
{
  $.backstretch = function(src, options, callback)
  {
    var defaultSettings =
    {
      centeredX: true, // Should we center the image on the X axis?
      centeredY: true, // Should we center the image on the Y axis?
      speed: 0         // fadeIn speed for background after image loads (e.g. "fast" or 500)
    },
    container = $("#backstretch"),
    settings = container.data("settings") || defaultSettings, // If this has been called once before, use the old settings as the default
    rootElement = ("onorientationchange" in window) ? $(document) : $(window), // hack to acccount for iOS position:fixed shortcomings
    imgRatio, bgImg, bgWidth, bgHeight, bgOffset, bgCSS;
    
    // Extend the settings with those the user has provided
    if(options && typeof options == "object") $.extend(settings, options);
    // Initialize
    $(document).ready(_init);
    // For chaining
    return this;

    function _init()
    {
      // Prepend image, wrapped in a DIV, with some positioning and zIndex voodoo
      if(src)
      {
        // if container exists, change z-index
        if (container.length > 0) container.css({zIndex: -9999});

        // create a new container
        var newcontainer = $("<div />").attr("id", "backstretch")
                                       .css({left: 0, top: 0, position: "fixed", overflow: "hidden", zIndex: -9998}),
            img = $("<img />").css({position: "relative", display: "none"})
                              .bind("load", function(e) {
                                  var self = $(this);
                                  imgRatio = $(e.target).width() / $(e.target).height();
  
                                  _adjustBG(function() {
                                      self.fadeIn(settings.speed, function() {
                                          // Remove the old container
                                            if (container.length > 0) container.remove();
                                          // Callback
                                          if(typeof callback == "function") callback();
                                        });
                                    });
                                })
                              .appendTo(newcontainer);

        // Attach the settings to new container
        newcontainer.data("settings", settings);
        // Attach new container to body        
        $("body").prepend(newcontainer);
        // Hack for IE img onload event
        img.attr("src", src);
        // Adjust the background size when the window is resized or orientation has changed (iOS)
        $(window).resize(_adjustBG);
      }
    }
        
    function _adjustBG(fn)
    {
      try
      {
        bgCSS = {left: 0, top: 0};
        bgWidth = rootElement.width();
        bgHeight = bgWidth / imgRatio;

        // Make adjustments based on image ratio
        // Note: Offset code provided by Peter Baker (http://ptrbkr.com/). Thanks, Peter!
        if(bgHeight >= rootElement.height())
        {
          bgOffset = (bgHeight - rootElement.height()) /2;
          if(settings.centeredY) $.extend(bgCSS, {top: "-" + bgOffset + "px"});
        }
        else
        {
          bgHeight = rootElement.height();
          bgWidth = bgHeight * imgRatio;
          bgOffset = (bgWidth - rootElement.width()) / 2;
          if(settings.centeredX) $.extend(bgCSS, {left: "-" + bgOffset + "px"});
        }

        $("#backstretch img").width( bgWidth ).height( bgHeight ).css(bgCSS);
      }
      catch(err)
      {
        // IE7 seems to trigger _adjustBG before the image is loaded.
        // This try/catch block is a hack to let it fail gracefully.
      }

      // Executed the passed in function, if necessary
      if (typeof fn == "function") fn();
    }
  };
})(jQuery);
