Array.prototype.in_array = function(p_val) {
  for(var i = 0, l = this.length; i < l; i++) {
	  if(this[i] == p_val) {
      return true;
	  }
  }
  return false;
}

Array.prototype.array_key_exists = function(key) {
  return (typeof this[key] != 'undefined');
}

$(document).ready(function() {
  // settings
  var contentLayer			= "#container #products .productList";
  var itemDiv           = "div.item";
  var images            = $(contentLayer).find(".item");
  var layerWidth 				= $(contentLayer).width();
  var layerHeight 			= 0;
  var done              = new Array;
  var imageGroups       = new Array;
  var prevTop           = 0;
  
  var imgMinHeight      = 1500; // nastavime vetsi cislo, abychom nasli mensi
  var imgMinWidth       = 1500;
  
  var space             = 10;
  
  /**
   * Getting max height of image
   */
  $(images).each(function() {
    layerHeight = Math.max(layerHeight, $(this).outerHeight());
    imgMinHeight = Math.min(imgMinHeight, $(this).outerHeight());
    imgMinWidth = Math.min(imgMinWidth, $(this).outerWidth()); 
    
    // vytvorime jednotlive skupiny v zavislosti na veliksotech obrazku
    if(!imageGroups.array_key_exists($(this).outerWidth())) {
      imageGroups[$(this).outerWidth()] = 1;
    } else {
      imageGroups[$(this).outerWidth()] = imageGroups[$(this).outerWidth()] + 1;
    }
  });
   
  /**
   * Settings position
   */   	
  function setPosition(image, top, left) {
    $(image).css({
      "position": "absolute",
      "top": top,
      "left": left,
      "width": image.width,
      "height": image.height
    });
  }
  
	/**
	 * Mosaic constructor
	 */
  function makeMosaic(width, height, top, left, start) {
    var image;
    
    // pokud je start vyssi nez pocet obrazku, ukoncime pruchod
    if(start >= images.length) return false;
    
    // pokud neni dostatek prostoru, zrusime
    if(width < imgMinWidth || height < imgMinHeight) return false;
    
    // projdeme vsechny obrazky
    //$(images).each(function(i) {
    for(var i = start, l = images.length; i < l; i++) {
      image = images[i];
      
      // pokud uz jsme dany obrazek pouzili, nebudeme pokracovat
      if(!done.in_array(i)) {
        if($(image).outerWidth() <= width && $(image).outerHeight() <= height) {
          if(done.length > 0 && prevTop == 0) {
            var prevImageWidth = images[done[done.length-1]].width;
            var prevImageHeight = images[done[done.length-1]].height;
          }
          
          if(prevImageWidth != 'undefined' && imageGroups[prevImageWidth] > 0 && prevImageWidth != $(image).outerWidth() && height > prevImageHeight) {
            return makeMosaic(width, height, top, left, start + 1);
          } else {
            // nastavime obrazek a odstranime jej z pole
            setPosition(image, top, left);
            prevTop = top;
            //images.splice(i, 1);
            done.push(i);
            imageGroups[$(image).outerWidth()] = imageGroups[$(image).outerWidth()] - 1;
            
            // projdeme zbytek pole pres dalsi mozajku
            makeMosaic($(image).outerWidth(), height - $(image).outerHeight(), top + $(image).outerHeight(), left, 0);
            makeMosaic(width - $(image).outerWidth(), height, top, left + $(image).outerWidth(), 0);
          }
          
          return true;
        } else {
          return makeMosaic(width, height, top, left, start + 1);
        }
      }
    }
    
    return false;
  }
  
  function setMosaic() {
    var counter = 0;
    while(done.length < images.length) {
      makeMosaic(layerWidth, layerHeight, counter * layerHeight, 0, 0);
      counter = counter + 1;
    }
  }
  
  setMosaic();
  
});
