$.extend($.fn, {
	imageGrid: function (width, wrapEleType, imgClass) {
		var grid = $(this);
		var wraps = grid.find(wrapEleType);
		var marginRight = parseInt(wraps.eq(0).css('margin-right'));

		var rows = [];
		var rowWidths = [];
		var row = [];
		var w = 0;
		var lastWrap = null;
		var i = 1;

		wraps.each(function(){
			var wrap = $(this);
			var iw = wrap.find('img.'+imgClass).eq(0).width();

			if(w + iw > width) {
				rows.push(row);
				row = [];
				rowWidths[i] = w - marginRight;
				w = 0;
				++i;
				lastWrap
					.css({
						'margin-right': 0
					})
					.addClass('gridLast');
			}

			w += iw + marginRight;

			row.push(wrap);
			wrap.addClass('row'+i);
			lastWrap = wrap;
		});

		if(row.length) {
			rows.push(row);
			row = [];
			w = 0;
			lastWrap.css({
				'margin-right': 0
			});
		}

		$.each(rows, function(i, val){
			grid.find(wrapEleType+'.row'+(i+1))
				.wrapAll('<div id="gridRow'+(i+1)+'" class="gridRow"></div>');
		});

		grid.find('.gridRow')
		.append('<div class="clearer">&nbsp;</div>')
		.css({
			'width': width,
			'overflow': 'hidden'
		}).each(function(){
			var t = $(this);
			if(t.find('.gridLast').length) {
				var wraps = t.find(wrapEleType);
				if(wraps.length > 1) {
					var rowId = t.attr('id').replace('gridRow', '');
					var diff = width - rowWidths[rowId];
					var oneDiff = Math.floor(diff / wraps.length);
					var rest = diff - (oneDiff * wraps.length);

					wraps.each(function(){
						var t = $(this);
						var img = t.find('img.'+imgClass).eq(0);
						var nWid = img.width() + oneDiff;

						if(t.hasClass('gridLast') && rest > 0) {
							nWid += rest;
						}

						t.css({
							'display': 'block',
							'overflow': 'hidden',
							'width': nWid,
							'height': img.height(),
						});

						img.css({
							'width': nWid,
						});
					});
				}
			}
		});
	}
});
