/**
 * Pseudo interface recensant les évènements que l'utilisateur peut compléter
 * pour personnaliser son traitement client.
 * 
 * @author Kosmos
 */
function CheckboxEventYahooUI() {

	// METHODES

	CheckboxEventYahooUI.prototype.doBeforeSelect = function() {
	};

	CheckboxEventYahooUI.prototype.doAfterSelect = function() {
	};

	CheckboxEventYahooUI.prototype.doBeforeDeselect = function() {
	};

	CheckboxEventYahooUI.prototype.doAfterDeselect = function() {
	};

	CheckboxEventYahooUI.prototype.doBeforeSelectAllOnPage = function() {
	};

	CheckboxEventYahooUI.prototype.doAfterSelectAllOnPage = function() {
	};

	CheckboxEventYahooUI.prototype.doBeforeDeselectAllOnPage = function() {
	};

	CheckboxEventYahooUI.prototype.doAfterDeselectAllOnPage = function() {
	};

	CheckboxEventYahooUI.prototype.doBeforeSelectAll = function() {
	};

	CheckboxEventYahooUI.prototype.doAfterSelectAll = function() {
	};

	CheckboxEventYahooUI.prototype.doBeforeDeselectAll = function() {
	};

	CheckboxEventYahooUI.prototype.doAfterDeselectAll = function() {
	};

};

/**
 * Classe gérant les comportements exécutés lors de l'utilisation des checkboxes
 * dans une grille.
 * 
 * @author Kosmos
 */
function CheckboxManagerYahooUI() {

	// ATTRIBUTS

	/** Les évènements que le client peut compléter */
	this.events = new CheckboxEventYahooUI();

	// METHODES

	/**
	 * Handler général responsable des intéractions avec les checkboxes.
	 * 
	 * @param idCheckbox
	 *            L'identifiant de la checkbox principale.
	 * @param idRow
	 *            L'identifiant unique de la checkbox.
	 * @param keys
	 *            La liste des checkboxes de la page.
	 * @param values
	 *            Le tableau des valeurs sélectionnées.
	 * @param provider
	 *            L'identifiant du provider pour l'appel au serveur.
	 * @param rows
	 *            Le nombre d'enregistrements sur une page.
	 * @param unique
	 *            Booléen déterminant si la grille est en mode sélection unique.
	 */
	CheckboxManagerYahooUI.prototype.checkboxHandler = function(idCheckbox,
			idRow, keys, values, provider, rows, unique) {

		if (window.document.getElementById(idRow).checked) {
			this.select(idCheckbox, idRow, keys, values, provider, false, rows,
					unique);
		} else {
			this.deselect(idCheckbox, idRow, keys, values, provider, false,
					rows, unique);
		}

	};

	/**
	 * Sélectionne une checkbox et sauvegarde sa valeur.
	 * 
	 * @param idCheckbox
	 *            L'identifiant de la checkbox principale.
	 * @param idRow
	 *            L'identifiant unique de la checkbox ou une liste
	 *            d'identifiants.
	 * @param keys
	 *            La liste des checkboxes de la page.
	 * @param values
	 *            Le tableau des valeurs sélectionnées.
	 * @param provider
	 *            L'identifiant du provider pour l'appel au serveur.
	 * @param onPage
	 *            Booléen déterminant si la sélection s'effectue sur la page ou
	 *            sur un enregistrement.
	 * @param rows
	 *            Le nombre d'enregistrements sur une page.
	 * @param unique
	 *            Booléen déterminant si la grille est en mode sélection unique.
	 */
	CheckboxManagerYahooUI.prototype.select = function(idCheckbox, idRow, keys,
			values, provider, onPage, rows, unique) {

		var process = function(o) {
			if (onPage) {

				// Evènement client optionnel.
				CheckboxEventYahooUI.prototype.doBeforeSelectAllOnPage();

				var value = 0;
				for ( var i = 0; i < keys.length; i++) {
					value = window.document.getElementById(keys[i]).value;
					values.add(value);
					window.document.getElementById(keys[i]).checked = true;
				}

				// Evènement client optionnel.
				CheckboxEventYahooUI.prototype.doAfterSelectAllOnPage();

			} else {

				// Evènement client optionnel.
				CheckboxEventYahooUI.prototype.doBeforeSelect();

				// Mode UNIQUE actif.
				if (unique) {

					// Désactivation des autres checkboxes.
					for ( var c = 0; c < keys.length; c++) {
						if (idRow != keys[c]) {
							window.document.getElementById(keys[c]).disabled = true;
						}
					}

				}

				var value = window.document.getElementById(idRow).value;
				values.add(value);

				// Evènement client optionnel.
				CheckboxEventYahooUI.prototype.doAfterSelect();

			}
			CheckboxManagerYahooUI.prototype.checkedAllOnPage(idCheckbox, keys,
					rows);
		};

		if (unique) {
			this
					.call(process, 'checkbox=unique;select' + ':' + idRow,
							provider);
		} else {
			this.call(process, 'checkbox=select' + ':' + idRow, provider);
		}

	};

	/**
	 * Désélectionne une checkbox et supprime sa valeur.
	 * 
	 * @param idCheckbox
	 *            L'identifiant de la checkbox principale.
	 * @param idRow
	 *            L'identifiant unique de la checkbox ou une liste
	 *            d'identifiants.
	 * @param keys
	 *            La liste des checkboxes de la page.
	 * @param values
	 *            Le tableau des valeurs sélectionnées.
	 * @param provider
	 *            L'identifiant du provider pour l'appel au serveur.
	 * @param onPage
	 *            Booléen déterminant si la désélection s'effectue sur la page
	 *            ou sur un enregistrement.
	 * @param rows
	 *            Le nombre d'enregistrements sur une page.
	 * @param unique
	 *            Booléen déterminant si la grille est en mode sélection unique.
	 */
	CheckboxManagerYahooUI.prototype.deselect = function(idCheckbox, idRow,
			keys, values, provider, onPage, rows, unique) {

		var process = function(o) {
			if (onPage) {

				// Evènement client optionnel.
				CheckboxEventYahooUI.prototype.doBeforeDeselectAllOnPage();

				var value = 0;
				for ( var i = 0; i < keys.length; i++) {
					value = window.document.getElementById(keys[i]).value;
					values.remove(value);
					window.document.getElementById(keys[i]).checked = false;
				}

				// Evènement client optionnel.
				CheckboxEventYahooUI.prototype.doAfterDeselectAllOnPage();

			} else {

				// Evènement client optionnel.
				CheckboxEventYahooUI.prototype.doBeforeDeselect();

				// Mode UNIQUE actif.
				if (unique) {

					// Activation des autres checkboxes.
					for ( var c = 0; c < keys.length; c++) {
						if (idRow != keys[c]) {
							window.document.getElementById(keys[c]).disabled = false;
						}
					}

				}

				var value = window.document.getElementById(idRow).value;
				values.remove(value);

				// Evènement client optionnel.
				CheckboxEventYahooUI.prototype.doAfterDeselect();

			}
			CheckboxManagerYahooUI.prototype.checkedAllOnPage(idCheckbox, keys,
					rows);
		};

		if (unique) {
			this.call(process, 'checkbox=unique;deselect' + ':' + idRow,
					provider);
		} else {
			this.call(process, 'checkbox=deselect' + ':' + idRow, provider);
		}

	};

	/**
	 * Handler responsable des intéractions avec les checkboxes d'une page
	 * donnée.
	 * 
	 * @param idCheckbox
	 *            L'identifiant de la checkbox principale.
	 * @param keys
	 *            La liste des checkboxes de la page.
	 * @param values
	 *            Le tableau des valeurs sélectionnées.
	 * @param provider
	 *            L'identifiant du provider pour l'appel au serveur.
	 * @param rows
	 *            Le nombre d'enregistrements sur une page.
	 */
	CheckboxManagerYahooUI.prototype.checkboxHandlerOnPage = function(
			idCheckbox, keys, values, provider, rows) {

		if (window.document.getElementById(idCheckbox).checked) {
			this.selectAllOnPage(idCheckbox, keys, values, provider, rows);
		} else {
			this.deselectAllOnPage(idCheckbox, keys, values, provider, rows);
		}

	};

	/**
	 * Sélectionne toutes les checkboxes sur une page donnée.
	 * 
	 * @param idCheckbox
	 *            L'identifiant de la checkbox principale.
	 * @param keys
	 *            La liste des checkboxes de la page.
	 * @param values
	 *            Le tableau des valeurs sélectionnées.
	 * @param provider
	 *            L'identifiant du provider pour l'appel au serveur.
	 * @param rows
	 *            Le nombre d'enregistrements sur une page.
	 */
	CheckboxManagerYahooUI.prototype.selectAllOnPage = function(idCheckbox,
			keys, values, provider, rows) {
		var params = '';
		for ( var i = 0; i < keys.length; i++) {
			params += keys[i];
			if (i != (keys.length - 1)) {
				params += ',';
			}
		}
		this.select(idCheckbox, params, keys, values, provider, true, rows);
	};

	/**
	 * Désélectionne toutes les checkboxes sur une page donnée.
	 * 
	 * @param idCheckbox
	 *            L'identifiant de la checkbox principale.
	 * @param keys
	 *            La liste des checkboxes de la page.
	 * @param values
	 *            Le tableau des valeurs sélectionnées.
	 * @param provider
	 *            L'identifiant du provider pour l'appel au serveur.
	 * @param rows
	 *            Le nombre d'enregistrements sur une page.
	 */
	CheckboxManagerYahooUI.prototype.deselectAllOnPage = function(idCheckbox,
			keys, values, provider, rows) {
		var params = '';
		for ( var i = 0; i < keys.length; i++) {
			params += keys[i];
			if (i != (keys.length - 1)) {
				params += ',';
			}
		}
		this.deselect(idCheckbox, params, keys, values, provider, true, rows);
	};

	/**
	 * Sélectionne toutes les checkboxes et sauvegarde toutes les valeurs.
	 * 
	 * @param idCheckbox
	 *            L'identifiant de la checkbox principale.
	 * @param keys
	 *            La liste des checkboxes de la page.
	 * @param values
	 *            Le tableau des valeurs sélectionnées.
	 * @param provider
	 *            L'identifiant du provider pour l'appel au serveur.
	 * @param idSelectAll
	 *            L'identifiant de la checkbox de sélection globale à cocher.
	 */
	CheckboxManagerYahooUI.prototype.selectAll = function(idCheckbox, keys,
			values, provider, idSelectAll) {

		var process = function(o) {

			// Evènement client optionnel.
			CheckboxEventYahooUI.prototype.doBeforeSelectAll();

			window.document.getElementById(idCheckbox).checked = true;
			for ( var i = 0; i < keys.length; i++) {
				window.document.getElementById(keys[i]).checked = true;
			}
			values.replace(eval(o.responseText));

			if (window.document.getElementById(idSelectAll) != null) {
				window.document.getElementById(idSelectAll).className = 'yui-button yui-checkbox-button yui-button-checked yui-checkbox-button-checked yui-button-focus yui-checkbox-button-focus';
			}

			// Evènement client optionnel.
			CheckboxEventYahooUI.prototype.doAfterSelectAll();

		};
		this.call(process, 'checkbox=selectAll:', provider);

	};

	/**
	 * Désélectionne toutes les checkboxes.
	 * 
	 * @param idCheckbox
	 *            L'identifiant de la checkbox principale.
	 * @param keys
	 *            La liste des checkboxes de la page.
	 * @param values
	 *            Le tableau des valeurs sélectionnées.
	 * @param provider
	 *            L'identifiant du provider pour l'appel au serveur.
	 * @param idDeselectAll
	 *            L'identifiant de la checkbox de sélection globale à décocher.
	 */
	CheckboxManagerYahooUI.prototype.deselectAll = function(idCheckbox, keys,
			values, provider, idDeselectAll) {

		var process = function(o) {

			// Evènement client optionnel.
			CheckboxEventYahooUI.prototype.doBeforeDeselectAll();

			window.document.getElementById(idCheckbox).checked = false;
			for ( var i = 0; i < keys.length; i++) {
				window.document.getElementById(keys[i]).checked = false;
			}
			values.clear();

			if (window.document.getElementById(idDeselectAll)) {
				window.document.getElementById(idDeselectAll).className = 'yui-button yui-checkbox-button';
			}

			// Evènement client optionnel.
			CheckboxEventYahooUI.prototype.doAfterDeselectAll();

		};
		this.call(process, 'checkbox=deselectAll:', provider);

	};

	/**
	 * Sélectionne la checkbox principale quand toutes les checkboxes d'une page
	 * donnée sont cochées et inversement.
	 * 
	 * @param idCheckbox
	 *            L'identifiant de la checkbox principale.
	 * @param keys
	 *            La liste des checkboxes de la page.
	 * @param rows
	 *            Le nombre d'enregistrements sur une page.
	 */
	CheckboxManagerYahooUI.prototype.checkedAllOnPage = function(idCheckbox,
			keys, rows) {

		if (keys.length == rows) {
			var allChecked = true;
			for ( var i = 0; i < keys.length; i++) {
				if (!window.document.getElementById(keys[i]).checked) {
					allChecked = false;
				}
			}
			if (allChecked) {

				window.document.getElementById(idCheckbox).checked = true;

			} else {

				window.document.getElementById(idCheckbox).checked = false;

			}
		}

	};

	/**
	 * Envoi une requête asynchrone au serveur.
	 * 
	 * @param process
	 *            Le processus exécuté au succès de a requête.
	 * @param params
	 *            Les paramètres à ajouter à la requête.
	 * @param provider
	 *            L'identifiant du provider.
	 */
	CheckboxManagerYahooUI.prototype.call = function(process, params, provider) {

		var AjaxObject = {
			handleSuccess : function(o) {
				this.processResult(o);
			},

			handleFailure : function(o) {
				window
						.alert('Impossible de (d\351)s\351lectionner la(les) checkbox(es).');
			},

			processResult : process,

			startRequest : function() {
				YAHOO.util.Connect.asyncRequest('POST',
						'DataGridController.do', callback, params
								+ '&amp;idDGP=' + provider);
			}
		};

		var callback = {
			success : AjaxObject.handleSuccess,
			failure : AjaxObject.handleFailure,
			scope : AjaxObject
		};

		AjaxObject.startRequest();

	};

};
