

/* Progress bar */
var wait = function() {
	var progressWrapper, bar, timer, interval;

	function _init() {

		/* Progress bar markup */
		$('#contenu').prepend(
				'<div id="progressWrapper">' +
						'<div class="contenuHaut"></div>' +
						'<div class="contenuInner"><div class="contenuInnerContent">' +
						'<div class="placeholderToggle" id="PH_Encart_Chargement_Grille"></div>' +
						'<div class="placeholderToggle" id="PH_Encart_Validation_Grille"></div>' +
						'<div id="progressContainer">' +
						'<p class="informations">Chargement en cours, merci de patienter <strong class="timer"></strong></p>' +
						'<div id="progress">' +
						'<div id="bar"></div>' +
						'</div>' +
						'</div>' +
						'<div id="PH_Encart_Bas"></div>' +
						'</div></div>' +
						'<div class="contenuBas"></div>' +
						'</div>'
		);

		progressWrapper = $('#progressWrapper');
		bar = $('#bar');
		timer = $('.informations .timer');

		setTimeout(function(){
			//$('.contenuInnerContent', progressWrapper).css( { 'height' : $('#grille_choix').height() } );
			//$('.contenuInnerContent', progressWrapper).css( { 'height' : '548px' } );
		}, 100);

		_hide();
	}

	function _count_down(time) {
		_show();
		timer.html(time + " seconde" + (time > 1 ? 's' : ''));
		interval = setInterval(function() {
			if (time-- < 1) {
				clearInterval(interval);
			}
			timer.html(time + " seconde" + (time > 1 ? 's' : ''));
		}, 1000);
	}

	function _progress(time) {
		_show();

		bar.animate({
			width: '100%'
		}, time * 1000);
	}

	function _hide() {
		progressWrapper.hide();
	}

	function _show() {
		progressWrapper.show();
	}

	function _reset(sTextAbove, sTextBelow) {
		if (!sTextAbove) {
			sTextAbove = 'Chargement en cours, merci de patienter <strong class="timer"></strong>';
		}
		if (!sTextBelow) {
			sTextBelow = '';
		}
		$("#progressContainer").html(
				'<p class="informations">'+sTextAbove+'</p>' +
						'<div id="progress">' +
						'<div id="bar"></div>' +
						'</div>' +
						'<p class="informations">'+sTextBelow+'</p>'
		);
		clearInterval(interval);
		timer = $('.informations .timer');
		bar = $('#bar');
//		timer.html('');
		bar.css({'width':0});
	}

	return {
		init		:_init,
		count_down	:_count_down,
		progress	:_progress,
		hide		:_hide,
		show		:_show,
		reset		:_reset
	};
}();


/* Grid interactions */
var grille = function() {

	var a_selected, grid;

	function _init() {

		grid = $('.grilleNumeroLink');
		a_selected = new Array();
		$("#grilleListe input:checked").each(function(){
			a_selected.push($(this).val());
		});

		select();
		/* Payants */
		$('li.grille_aleat a').bind('click', function(e) {
			e.preventDefault();
			aleat();
		});
		$('li.grille_suppr a').bind('click', function(e) {
			e.preventDefault();
			clear();
		});
		$('li.grille_sauvegarde a').bind('click', function(e) {
			e.preventDefault();
			sauvegarde();
		});
		$('li.grille_gestion a').bind('click', function(e) {
			e.preventDefault();
			gestion();
		});

		/* Gratuit */
		$('li.button_aleat a').bind('click', function(e) {
			e.preventDefault();
			popin.aleat();
		});
		$('li.button_suppr a').bind('click', function(e) {
			e.preventDefault();
			popin.suppr();
		});
		$('li.button_gestion a').bind('click', function(e) {
			e.preventDefault();
			popin.gestion();
		});
		$('li.button_sauvegarde a').bind('click', function(e) {
			e.preventDefault();
			popin.sauvegarde();
		});

		$("#grille_choix").submit(function(e) {
			if (Object.size(a_selected) < 6) {
				e.preventDefault();
				message.show('Pour que votre grille de jeu soit prise en compte, vous devez sélectionner 6 numéros.\ ' +
						'Merci de bien choisir 6 numéros exactement.');
				return false;
			}
			// Gestion appel Ajax vers serveur (rien à envoyer, la grille est déjà en session)
			if ($('body').hasClass('user')) {
				e.preventDefault();
				actionManager.proceedAction("grid_valid", {});
			}
		});


		if ($('body').hasClass('user') && $('body').hasClass('play')) {
			actionManager.proceedAction("grid_play", {});
		}
	}

	function select() {
		grid.bind('click', function(e) {
			e.preventDefault();
			var elmt = $(this);
			var input = elmt.siblings('input');
			var li = elmt.parents('.grilleNumero');

			if (input.is(':checked')) {
				li.removeClass('grilleNumeroSelected');

				/*if (ltie8) {
				 a_selected.splice(a_selected.indexOf(elmt.text()), 1);
				 } else {
				 a_selected.splice(a_selected.indexOf(elmt.text()), 1);
				 }*/

				$(this).addClass('grilleClear');
				$(this).mouseleave(function() {
					$(this).removeClass('grilleClear');
				});

				// Gestion appel Ajax vers serveur
				actionManager.proceedAction("grid_number", {
					"number" : elmt.text(),
					"subAction" : "uncheck"
				});
				input.click();
			} else {
				if (Object.size(a_selected) < 6) {
					a_selected[Object.size(a_selected)] = elmt.text();

					// Gestion appel Ajax vers serveur
					actionManager.proceedAction("grid_number", {
						"number" : elmt.text(),
						"subAction" : "check"
					});
				} else {
					message.show('Pour que votre grille de jeu soit prise en compte, vous devez sélectionner 6 numéros. Vous avez déjà sélectionné 6 numéros.');
				}
			}
		});
	}

	function aleat() {
		// On demande la grille aléatoire au serveur
		actionManager.proceedAction("grid_random", {});
	}
	function gestion() {
		// On demande au serveur le délai
		actionManager.proceedAction("grid_manage", {});
	}

	function clear() {
		// Meme pour vider la grille on demande au serveur
		actionManager.proceedAction("grid_clear", {});
	}

	function sauvegarde() {
		if (Object.size(a_selected) == 6) {
			actionManager.proceedAction("grid_save", {"grid":a_selected});
		} else {
			message.show('Vous devez sélectionner 6 numéros pour que votre grille soit valide');
		}
	}

	function _getGrille() {
		return a_selected;
	}

	function _setGrille(aGrille) {
		a_selected = aGrille;
	}
	return {init:_init, getGrille:_getGrille, setGrille:_setGrille};

}();

var actionManager = function() {

	function _init() {

	}
	/**
	 * L'action se passe en 2 temps, via 2 appels ajax :
	 *		- actionDelay : permet de déterminer le temps à attendre pour cette action (ou le temps restant)
	 *		- actionDo : après avoir attendu le délais donné, cette méthode réalise l'action
	 */
	function _proceedAction(sActionName, aData) {
		var delay;

		$.ajax("/user/actionDelay", {
			type: 'POST',
			data: {
				xhr: 'json',
				process : sActionName
			},
			success : function(aReturn) {
				if (!aReturn.error) {
					// On effecture le délai si nécessaire
					aData.process = sActionName;
					// Nom de l'encart à charger
					$(".placeholderToggle").html("");
					if (aReturn["aGadSenseEncart"]) {
						for(iEncart in aReturn["aGadSenseEncart"]) {
							$("#PH_"+aReturn["aGadSenseEncart"][iEncart]).html($("#Content_"+aReturn["aGadSenseEncart"][iEncart]).html());
						}
					}
					switch (sActionName) {
						case "grid_number" :
//							$('#progressWrapper .contenuInnerContent').css( { 'height' : 100 } );
							if (aData["subAction"] == "check") {
								sTextAbove = "<br /><br /><h1>Votre numéro sélectionné est en cours de chargement.</h1>";
							} else {
								sTextAbove = "<br /><br /><h1>Le décochage de votre numéro est en cours !</h1>";
							}
							//sTextBelow = "<br />Pour jouer sans chargement, <a href=''>cliquez-ici</a>";
							sTextBelow = "";
							break;
						default :
							sTextAbove = null;
							sTextBelow = null;
					}

					processDelay(aReturn.delay,
							function(aDataReturn) {
								wait.hide();
								// On effectue la requête
								switch (sActionName) {
									case "grid_play" :
										// Rien à faire qu'à attendre
										break;
									default :
										processAction(sActionName, aData);
										break;
								}
							},
							sTextAbove,
							sTextBelow
					);
				}
				else {
					return true;
				}
			}
		});
	};

	// Affiche la popup d'attente
	function processDelay(iSeconds, fFunction, sTextAbove, sTextBelow) {

		// Popup d'attente
		if (iSeconds > 0){
			wait.reset(sTextAbove, sTextBelow);
			wait.count_down(iSeconds);
			wait.progress(iSeconds);
		}

		setTimeout(fFunction, iSeconds * 1000);
	}

	function processAction(sActionName, aData) {
		$.ajax("/user/actionDo", {
			type: 'POST',
			data: {
				xhr: 'json',
				process : sActionName,
				aData : aData
			},
			success : function(aReturn) {
				switch (sActionName) {
					case "grid_clear" :
						var aGrid = new Array();
						break;
					case "grid_valid" :
						// Récupération du HTML des grilles
						$("#grilles_jour").load("/user/encartGrids", function(sHtml, sStatus, e) {});
					case "grid_random" :
					case "grid_number" :
						var aGrid = aReturn["grid"];
//						$('#progressWrapper .contenuInnerContent').css( { 'height' : $('#grille_choix').height() } );
						break;
					case "grid_save" :
						break;
					case "grid_manage" :
						aReturn["location"] = '/user/grid'
						break;
				}
				// Rechargement de la grille si besoin
				if (aGrid) {
					updategrid(aGrid);
				}
				// Affichage des messages
				if (aReturn["aMessages"] && aReturn["aMessages"].length > 0) {
					for(var iMess in aReturn["aMessages"]) {
						message.show(aReturn["aMessages"][iMess]);
					}
				}
				if (aReturn["aErrors"] && aReturn["aErrors"].length > 0) {
					for(var iError in aReturn["aErrors"]) {
						message.show(aReturn["aErrors"][iError]);
					}
				}
				// Redirection
				if (aReturn["location"]) {
					window.location = aReturn["location"];
				}
			}
		});
	}

	function updategrid(aGrid) {
		$("#grilleListe input.grilleNumeroInput").removeAttr("checked");
		$("#grilleListe li.grilleNumero").removeClass("grilleNumeroSelected");
		grille.setGrille(aGrid);

//var sNumbers = "grille: ";
		var iNumber;
		for(var i in aGrid) {
			iNumber = parseInt(aGrid[i], 10);

			if (typeof iNumber == "number") {
//sNumbers += " "+iNumber;
				$("input#grilleNumero"+iNumber).attr("checked", "checked").parent("li.grilleNumero").addClass("grilleNumeroSelected");
			}
		}
//alert(sNumbers);

	}

	return {init:_init, proceedAction:_proceedAction, processAction:processAction};
}();

Object.size = function(obj) {

	var size = 0, key;
	for (key in obj) {
		if (obj.hasOwnProperty(key)) size++;
	}
	return size;
};

