/*
Загрузчик картинок v0.1
Идея в следующем: создается картинка в документе, через которую все будет
загружаться. На картинку вешается событие onLoad, с помощью которого
организовывается цепочка закачивания картинок.

Сначала с помощью метода Add нужно заполнить массив с картинками, потом через
SetCallback можно добавить callback-метод, который будет выполняться после 
каждой закачанной картинки, передавая в функцию ее ID (индекс в массиве).
Затем запускается метод Load, в который для удобства можно передать callback-функцию.
*/

//в Opera 7.5 есть баг: после первой загруженной картинки событие onLoad не хочет работать
var bIsBwOK = !(/Opera [1-7](\.[5-9]+)?/.test(navigator.userAgent));

function ImagePreloader(){
	this.oPtr=null;
	this.oStack={};
	this.fCallback=null;
	this.sNextID=0;
	
	this.CreateImage();
}

ImagePreloader.prototype.ClearStack=function(){
	delete this.oStack;
	this.oStack={};
}

//~ создает картинку на странице, удаляя ранее созданную
ImagePreloader.prototype.CreateImage=function(){
	if(this.oPtr)
		this.oPtr.parentNode.removeChild(this.oPtr);
		
	this.oPtr=document.createElement('img');
	this.oPtr.style.position='absolute';
	this.oPtr.style.left='0px';
	this.oPtr.style.top='0px';
	this.oPtr.style.visibility='hidden';
	this.oPtr.width=10;
	this.oPtr.height=10;
	document.body.appendChild(this.oPtr);
	
	var oLink=this;
	var fLoad=function(){
		oLink.onLoad();
	}
	addEvent(this.oPtr, 'load', fLoad);
}

//static property -- должен быть глобальным для всех объектов класса
ImagePreloader.iCurrentID=0;

ImagePreloader.prototype.Add=function(sImagePath){
	this.oStack['i'+(++this.constructor.iCurrentID)]=sImagePath;
	return this.constructor.iCurrentID;
}

ImagePreloader.prototype.SetCallback=function(fCallback){
	if(fCallback)
		this.fCallback=fCallback;
}

ImagePreloader.prototype.ClearCallback=function(){
	this.fCallback=null;
}

ImagePreloader.prototype.Load=function(fCallBack){
	this.SetCallback(fCallBack);
	this.LoadNext();
}

ImagePreloader.prototype.onLoad=function(){
	if(this.fCallback)
		this.fCallback(this.sNextID.substr(1));
	
	if(!bIsBwOK)
		this.CreateImage();
	
	this.LoadNext();
}

ImagePreloader.prototype.LoadNext=function(){
	//получаем указатель на первый элемент в стэке и тут же его удаляем
	this.sNextID=0;
	for(this.sNextID in this.oStack) break;
	if(!this.sNextID)
		return;
	
	this.oPtr.src=this.oStack[this.sNextID];
	delete this.oStack[this.sNextID];
}
