﻿function ImagePreloader(m_container, am_options) {

 var o_self = this;
 var $o_container = $(m_container);
 var $o_elements;
 var b_ready = false;
 var i_imagesLoaded = 0;

 var am_defaultOptions = {
  background: true,
  image: true,
  callbackOnComplete: null,
  fixPNG: true
 };

 am_options = $.extend({}, am_defaultOptions, am_options);

 this.ready = function() { return b_ready; }

 function init() {
  i_imagesLoaded = 0;

  if (am_options.background) $o_elements = $o_container.filter(function() { return /^url\(["']?([^"']*)["']?\)$/i.test($(this).css('backgroundImage')); });
  if (am_options.image) $o_elements.add($o_container.filter(function() { return this.tagName == 'img'; }));

  if ($o_elements.length == 0) finish();

  $o_elements.each(function(index) {
   var s_imageUrl = '';

   if ($(this).css('backgroundImage').match(/^url\(["']?([^"']*)["']?\)$/i)) s_imageUrl = RegExp.$1;

   if ($.browser.msie && s_imageUrl != '' && am_options.fixPNG) $(this).fixPNG();

   if (this.tagName == 'img') s_imageUrl = this.src;

   if (s_imageUrl != '') {
    var o_imagePreloader = new Image;
    $(o_imagePreloader).unbind().bind('load error', onLoad);
    o_imagePreloader.src = s_imageUrl;
   } else onLoad();
  });
  
 }

 function onLoad() {
  if (++i_imagesLoaded == $o_elements.length) finish();
 }

 function finish() {
  b_ready = true;
  if (am_options.callbackOnComplete && $.isFunction(am_options.callbackOnComplete)) am_options.callbackOnComplete();
 }

 init();

 return this;

};
