/**
 * @author Sergey Chikuyonok (sc@design.ru)
 * @copyright Art.Lebedev Studio (http://www.artlebedev.ru)
 */

var multiLoader = (function() {
	/** Индекс текущего домена */
	var cur_domain = 0;

	/** Индекс текущей картинки */
	var cur_image = 0;

	/** Количество одновременных потоков загрузки с одного домена */
	var load_threads = 2;

	/** загруженные картинки */
	var loaded_images = [];

	/** Массив доменов, с которых нужно грузить картинки */
	var domains = [];

	/** Массив картинок для загрузки */
	var images = [];

	/**
	 * Слушатели
	 */
	var listeners = {
		onImageLoaded: [],
		onLoadComplete: []
	};

	/**
	 * Загружает картинку с определенного домена
	 * @param {String} img URL картинки
	 * @param {String} domain Домен, с которого нужно грузить картинки
	 */
	function loadImage(oneimg, domain) {
		var img_obj = new Image();
		if ($.browser.msie || $.browser.opera){
		    var img_src = $("img",oneimg).css('background-image').slice(6+domain_length, -2);
		}
		else{
			var img_src = $("img",oneimg).css('background-image').slice(4, -1);
		}
        img_obj.onload = function(){
			loadCallback(oneimg)
		};
		img_obj.src = img_src;
	}
	/**
	 * Callback-функция, выполняемая после загрузки одной картинки
	 */
	function loadCallback(oneimg) {
		loaded_images.push(oneimg);
		broadcast('onImageLoaded', oneimg);
		if (cur_image < images.length) {
			cur_domain = 0;
			setTimeout(function(){
				loadImage(images[cur_image++], domains[cur_domain]);
			}, 1);
		}
	}

	/**
	 * Вещает событие <code>type</code> всем слушателям
	 * @param {String} type Тип события
	 * @param {Object} [...] Дополнительные аргументы
	 */
	function broadcast(type) {
		var args = Array.prototype.slice.call(arguments, 1) || [];
		var lst = listeners[type];
		for (var i = 0; i < lst.length; i++) {
			lst[i].apply(window, args);
		}
	}

	return {
		/**
		 * Начинает многопотоковую загрузку картинок
		 * @param {Array} img Массив картинок, которые нужно загрузить
		 * @param {Array} dom Массив доменов, с которых нужно грузить
		 */
		start: function(img, dom) {
			images = img;
			domains = dom;
			cur_domain = 0;
			cur_image = 0;
			domain_length = domains[0].length;
			for (var i = 0; i < domains.length; i++) {
				for (var j = 0; j < load_threads; j++) {
					loadImage(images[cur_image++], domains[i]);
				}
			}
		},

		/**
		 * Добавляет слушателя на конец загрузки
		 * @param {String} type Тип события (onImageLoaded, onLoadComplete)
		 * @param {Function} func Callback-функция
		 */
		addListener: function(type, func) {
			listeners[type].push(func);
		},

		/**
		 * Возвращает массив всех загруженных картинок
		 * @param {Array}
		 */
		getLoadedImages: function(){
			return loaded_images;
		}
	}
})();

multiLoader.addListener('onImageLoaded', function(src){
	$(src).css("display","block");
});

multiLoader.addListener('onLoadComplete', function(){
	//console.log('Load complete');
});