// ----
// Preload
// ----
// Clásica tapa por encima de todo para no fastidiar
// Incluye también un preload a mostrar
// ----

REAL.Preload = (function () {

	// Private variables
	var _$tapa, _$preload,
		_spinner,
		_visible,
		_imgs,
		_imgsTotal,
		_imgsLoaded,
		_callback;

	// Public variables
	var obj			= {};
		obj.showed	= new signals.Signal();
		obj.hided	= new signals.Signal();
		obj.done	= new signals.Signal();


	// Private methods
	function init() {

		_visible	= false;

		modifyDOM();
		addEventListeners();
	}

	function modifyDOM() {

		_$tapa = $("#real-tapa");
		if (_$tapa.size() == 1) _$tapa.remove();

		var dom  = '<div id="real-tapa" style="position:fixed;top:0px;left:0;width:100%;height:100%;display:block;z-index:6666;background-color:#000"><div id="real-tapa-preload" style="width:40px;height:40px; margin:0 auto;"></div></div>';
		$(dom).appendTo("body");

		_spinner = new Spinner({
			lines: 16,
			length: 7,
			width: 3,
			radius: 15,
			color: '#fff',
			speed: 1.2,
			trail: 35,
			shadow: true
		}).spin(document.getElementById('real-tapa-preload'));

		_$tapa = $("#real-tapa");
		_$tapa.hide();
		_$preload = _$tapa.find("#real-tapa-preload");
	}

	// Events

	function addEventListeners() {

		obj.showed.add(onPreloadShow);
		obj.hided.add(onPreloadHide);
	}

	// Show / Hide

	function onPreloadShow(e) {

		_visible = true;
		_$tapa.animate({opacity:1}, "normal").show();
		_$preload.css({marginTop:$(window).height()/2});
	}

	function onPreloadHide(e) {

		_$tapa.stop().animate({opacity:0}, "slow", function () {
			_$tapa.css({ backgroundColor: "rgba(0, 0, 0, 0.5)" });
			_visible = false;
			_$tapa.hide();
		});
	}

	// Images preload

	function preload(imgs, coverColour, callback) {

		_imgs		= imgs;
		_imgsTotal	= imgs.length;
		_imgsLoaded	= 0;
		_callback	= callback;

		// setup cover
		var colour = coverColour || "transparent";
		_$tapa.css({ backgroundColor: colour });
		onPreloadShow();

		// preload images
		for (var i=0; i<_imgsTotal; i++){
			$('<img />').load(function(){
				preloadImageEnd($(this)[0].src);
			}).attr('src', _imgs[i]);
		}
	}

	function preloadImageEnd(url) {

		_imgsLoaded++;
		if (_imgsLoaded == _imgsTotal){
			onPreloadHide();
			obj.done.dispatch();
			if (_callback) setTimeout(function() { _callback(); }, 1000);
		}
	}

	// Getter

	function isVisible() {

		return _visible;
	}

	// Public methods
	obj.init		= init;
	obj.preload		= preload;
	obj.isVisible	= isVisible;

	return obj;

})();

