/////////////////////////////////
//                             //
//   Author: Gritsay Yevgeniy  //
//   yevgen_grytsay@mail.ru    //
//                             //
/////////////////////////////////

//TODO:
//	1) handle window.onabort
//	2) try a few times (at least two) to load if an error occured (var attempts)

function ImageLoader(pSrc, pCallback) {
	this.src = pSrc;	
	this.callback = pCallback || function(){};
	this.args = [];
	
	var len = arguments.length;
	
	for(var i = 2; i < len; i++) {
		this.args[i-2] = arguments[i];
	}
}



ImageLoader.prototype.load = function() {
	var newImage		= new Image();
	var _self			= this;
	//var attempts		= 2;
	var attemptTime		= 15000;	// 25s
	var pollInterval	= null;
	var intervalTime	= 200;
	var loadComplete	= false;
	var loadError		= false;
	var startTime		= null;
	var timeNow			= null;
	
	/**
	*	Private functions
	*/
	function ___pause(ms) {
		var date = new Date(); 
		curDate = null;
		do { var curDate = new Date(); }
		while ( curDate - date < ms);
	};
	
	function __onLoadComplete() {
		if(newImage && newImage.onload)
			newImage.onload = null;
		//clearInterval(pollInterval);
		
		_self.callback(newImage, [_self.args[0]]);
	}
	
	function __onLoadError() {
		newImage = null;
		__onLoadComplete();
	}
	
	/**
	*	Logic
	*/
	newImage.onload = function() {
		loadComplete = true;
	}
	
	newImage.onerror = newImage.onabort = function()  {
		loadError = true;
	}
	
	newImage.src = this.src;
	
	// For Opera
	if(newImage.complete === true) {
		loadComplete = true;
	}
	
	// Polling
	startTime = (new Date()).getTime();
	pollInterval = setInterval(function() {
		
		//Debug:	
		//document.body.innerHTML = 'Trying to load image: ' + (timeNow - startTime)/1000 + 's';
		
		if(loadComplete === true) {
			clearInterval(pollInterval);
			__onLoadComplete();
			return true;
		}
		
		timeNow = (new Date()).getTime();
		if(timeNow - startTime > attemptTime || loadError === true) {
			clearInterval(pollInterval);
			__onLoadError();
			return false;
		}
		
		
	}, intervalTime);
	
	//return newImage;
}
