///////////////////////////////////////////////////////////////////////////////
//	CTForm - fonctions JavaScript/Côté client pour CTForm PHP
//	
//	(c) 2010 - Mathieu de Lorimier, tout droit réservés. 
//
//	Version : 0.365
/////////////////////////////////////////////////////////////////////////////
// TODO : Lors de la modification, quand la clef change ne pas faire un insert (a tester)
// TODO : Fonction qui recharge la table en entier / trier
// TODO : Améliorer la transition entre le texte et les champs
// ---------------------------------------------------------------------------------------------
// FAIT : Mettre dans un plugin JQuery au lieu de fonctions javascript directe
// FAIT : Quand on sélectionne une ligne donner le focus au input appropriée (pas ua premier input)
// FAIT : Quand l'utilisateur clique dans le document sortir du mode d'édition (et enregistrer, a tester)
// FAIT : Ajouter les fonction pour l'ajout d'une rangée (a tester)
// FAIT : Quand on clique a l'extérieur des champs ajouter sortir du mode ajouter
// FAIT : Quand on sélectionne une ligne pour modifier et qu'on est en train d'ajouter demander si on sors et enregistre les modifications
// FAIT : Amliorer les résultats des champs select
// FAIT : Sortir du mode Ajout quand on clique a l'extérieur du tableau

(function($) {

	var data = '';
	var methods = {
		init : function(options) 
		{
			
			return this.each(function() {
				if($(this).attr("tagName") == "TABLE")
				{
					$(this).find('tr.ligneDonnees').bind('click', methods.LigneDonnees_Click);
					$(this).find('tr.ligneFonction input[name=btnAjouter]').bind('click', methods.Ajouter_Click);
					$(this).find('tr.ligneFonction input[name=btnAnnuler]').bind('click', methods.Annuler_Click);
					$(this).find('tr.ligneFonction input[name=btnModifier]').bind('click', methods.Modifier_Click);
					$(this).find('tr.ligneFonction input[name=btnSupprimer]').bind('click', methods.Supprimer_Click);
					$(document).bind('click',{objCTable: this}, methods.ligneDonne_Sortie);
					
					var data = $(this).data('CTForm_dTable');
					
					if(!data)
					{
						$(this).data('CTForm_dTable', {target: $(this), id: $(this).attr("id"), etat: 'table', perm: options.perm, action: options.action, rangCour: null});
					}
				}
			});

		},
		destroy : function() 
		{
			return this.each(function() {
				 var $this = $(this), data = $this.data('CTForm_dTable');
				 //data.tooltip.remove();
				$(window).unbind('.tooltip');
			});

		},
		LigneDonnees_Click : function(event) 
		{
			var parent = $(this).parents('table');
			var data = parent.data('CTForm_dTable');
			
			if(data.perm.Modifier)
			{
				// Déterminer de quel element provient le click
				if(this.nodeName && this.nodeName == "TR")
				{	
					// Déterminer si un autre ligne est en train de se faire éditer
					var Precedents = $(this).siblings('tr.LigneSel');
					var lePrecedent = (Precedents.length > 0 ? Precedents.first() : false);
					var ligneAjout = parent.find('tr.ligneAjouterChamps');
					
					var objLigne = $(this);
					
					var data = parent.data('CTForm_dTable');
					
					if(lePrecedent && objLigne.html() != lePrecedent.html())
					{
						methods.Enregistrer(lePrecedent);
					}
		
						// Permettre la modification
					if(!objLigne.hasClass('LigneSel') && (data.etat == 'table' || data.etat == 'modif'))
					{
						objLigne.addClass('LigneSel');
						
						objLigne.find('td').each(function(){
							var val = $(this).attr('title');
							var champModif = ligneAjout.find('td[rel=' + $(this).attr('rel') + '] > input, td[rel=' + $(this).attr('rel') + '] > select').first().clone();
							
							champModif.attr('id',champModif.attr('id') + '_modif');
							champModif.val(val);
							$(this).html('');
							$(this).append(champModif);
							//$(this).html('<input type="text" name="' + $(this).attr('rel') + '" value="' + val + '"/>');
						});
						
						if(event.srcElement)
							$(event.srcElement).find('input:visible').focus();
						else
							objLigne.find('input:visible').first().focus();
						
						objLigne.find('input, select').keypress(function(event) {
							  if (event.keyCode == '13') 
							  {
								// Sauvegarder quand retour
								  event.preventDefault();
								  methods.Enregistrer($(this).parents('tr'));
							  }
						});
						
						data.etat = 'modif';
						data.rangCour = objLigne;
						methods.afficherFonctions(parent, data);
						parent.data('CTForm_dTable', data);
					}
				}
			}
		},
		ligneDonne_Sortie : function(event) { 
			// ...
			if((event.originalTarget && $(event.originalTarget).parents('table[id=' + $(event.data.objCTable).attr('id') + ']').length == 0) || (event.srcElement && $(event.srcElement).parents('table[id=' + $(event.data.objCTable).attr('id') + ']').length == 0)) // A vérifier
			{
				var ligneSel = $(this).find('table[rel=CTForm] tr.LigneSel:first');
				
				if(ligneSel.length > 0)
					methods.Enregistrer(ligneSel);
			}
		},
		Enregistrer : function(objLigne) {
			var parent = $(objLigne).parents('table');
			
			if(parent)
			{
				var data = parent.data('CTForm_dTable');
			}
			
			if(parent && data.perm.Modifier)
			{				
				var aModifie = false;
				var ctfData = parent.data('CTForm_dTable');
				
				objLigne.find("td").each(function(){
					if(($(this).attr('title') != $(this).find('input, select').first().val()) && !$(this).hasClass('ColoneSuprimer'))
					{	
						aModifie = true;
					}
				});
				
				////////////////////////////////////////////////////////////////////
				// Sortir de la modification et enregistrer
				if(aModifie && window.confirm('Enregistrer les modifications?'))
				{
					// Enregistrer les modifications (AJAX)
					var strRequete = objLigne.find('input, select').serialize();
					
					
					objLigne.find('td').each(function(){
						if($(this).attr('rel') && $(this).attr('rel') != '')
						{
							strRequete += '&_' + $(this).attr('rel') + '=' + $(this).attr('title');
						}
					});
					
					strRequete += '&' + $(document).find('[rel=dTableSubmit]').serialize();
					strRequete += '&CTFormAction=modifier';
	
					// TODO: A faire async=true, exécuter les résultats dans success, modification de la clef
					$.ajax({
						url: ctfData.action,
						async: true,
						type: "POST",
						data: strRequete,
						dataType: "json",
						success: function(data, textStatus, XMLHttpRequest) {
							if(data.resultat == 'ok')
							{		
								var Val = '';
								var ValTitre = '';
								var Select = null;
								
								objLigne.find('td').each(function(){
									if(data[$(this).attr('rel')])
									{
										Select = $(this).find('select option:selected').first(); 
										if(Select.length > 0)
										{
											Val = Select.text();
											ValTitre = data[$(this).attr('rel')];
										}
										else
										{
											ValTitre = Val = data[$(this).attr('rel')];
										}
										$(this).html(Val);
										$(this).attr('title', ValTitre);
									}
								});
								
								objLigne.removeClass('LigneSel');

								ctfData.etat = 'table';
								ctfData.rangCour = null;
								methods.afficherFonctions(parent, ctfData);
								parent.data('CTForm_dTable', ctfData);
							}
							else
							{
								// Erreur de validation
								for(var element in data)
								{
									if(data[element] == false)
									{
										objLigne.find('input[name=' + element + ']').addClass('CTFormChampErreur');
									}
								}
								
								if(data['mysql_Error'])
									alert(data['mysql_Error']);
							}
						}
					   }
					);
					
					return;
				}
				else
				{
					// Ne pas enregistrer les modifications
					objLigne.find("td").each(function(){
							var Val = '';
							var ValTitre = '';
							
							Select = $(this).find('select option:selected').first(); 
							if(Select.length > 0)
							{
								Val = Select.text();
								ValTitre = data[$(this).attr('rel')];
							}
							else
							{
								ValTitre = Val = $(this).attr('title');
							}
							$(this).html(Val);
							$(this).attr('title', ValTitre);
					});
					
					objLigne.removeClass('LigneSel');
					

					data.etat = 'table';
					data.rangCour = null;
					methods.afficherFonctions(parent, data);
					parent.data('CTForm_dTable', data);
				}
			}

		},
		getData : function() { 
			//
		},
		
		Ajouter_Click : function() { 
			var parent = $(this).parents('table');
			var ligneAjout = parent.find('tr.ligneAjouterChamps');
			var donneesVide = parent.find('tr.ligneDonneesVide');
			var ctfData = parent.data('CTForm_dTable');
			
			if(ctfData.perm.Ajouter)
			{
				if(ctfData.etat == 'table')
				{
					ligneAjout.show();
					ligneAjout.find('input:visible, select:visible').first().focus();
					
					ctfData.etat = 'ajout';
					methods.afficherFonctions(parent, ctfData);
					parent.data('CTForm_dTable', ctfData);
				}
				else if(ctfData.etat == 'ajout')
				{
					var strRequete = ligneAjout.find('input, select').serialize();
					strRequete += '&' + $(document).find('[rel=dTableSubmit]').serialize();
					strRequete += '&CTFormAction=ajouter';
					parent.find('.ImgChargement').show();
					
					// Requête ajax qui enregistre les données
					$.ajax({
						url: ctfData.action,
						async: true,
						type: "POST",
						data: strRequete,
						dataType: "json",
						success: function(data, textStatus, XMLHttpRequest) {
							if(data.resultat == 'ok')
							{
								// Ajouter une ligne
								var ligneDonnee = donneesVide.clone();
								ligneAjout.before(ligneDonnee);
								ligneAjout.find('.ImgChargement').show();
								
								// Ajouter les données renvoyés par le json de la page ajax
								var Select = null;
								var SelectElement = null;
								var Val = '';
								var ValTitre = '';
								
								ligneDonnee.find('td').each(function(){
									if(data[$(this).attr('rel')])
									{
										SelectElement = Select = null;
										SelectElement = ligneAjout.find('td[rel=' + $(this).attr('rel') + '] select:first');
										
										if(SelectElement.length > 0)
											Select = SelectElement.find('option[value=' + SelectElement.val() + '];').first();
										
										if(Select && Select.length > 0)
										{
											Val = Select.text();
											ValTitre = data[$(this).attr('rel')];
										}
										else
										{
											ValTitre = Val = data[$(this).attr('rel')];
										}
										$(this).html(Val);
										$(this).attr('title', ValTitre);
										
										//$(this).html(data[$(this).attr('rel')]);
									}
									ligneAjout.find('td[rel=' + $(this).attr('rel') + '] select, input').val('');
								});
								
								ligneAjout.find('.ImgChargement').hide();
								ligneAjout.hide();
								ligneDonnee.show();
								ligneDonnee.removeClass('ligneDonneesVide');
								ligneDonnee.addClass('ligneDonnees');
								
								ctfData.etat = 'table';
								methods.afficherFonctions(parent, ctfData);
								parent.data('CTForm_dTable', ctfData);
							}
							else
							{
								// Erreur de validation
								for(var element in data)
								{
									if(data[element] == false)
									{
										ligneAjout.find('input[name=' + element + ']').addClass('CTFormChampErreur');
									}
								}
								
								if(data['mysql_Error'])
									alert(data['mysql_Error']);
							}
						}
					   }
					);
				}
			}

		},
		Annuler_Click : function() {
			var parent = $(this).parents('table');
			var ligneAjout = parent.find('tr.ligneAjouterChamps');
			var data = parent.data('CTForm_dTable');
			
			if(data.etat == "ajout")
			{
				if(confirm('Effacer les données?'))
				{
					ligneAjout.hide();
					ligneAjout.find('input').val('');
					ligneAjout.find('select option:first').attr('selected', 'selected');

					data.etat = 'table';
					methods.afficherFonctions(parent, data);
					parent.data('CTForm_dTable', data);
				}
			}
			else if(data.etat == "modif")
			{
				var lePrecedent = parent.find('tr.LigneSel:first');
				
				if(lePrecedent.length > 0)
				{
					methods.Enregistrer(lePrecedent);
				}
			}
		},
		Modifier_Click : function() {
			var parent = $(this).parents('table');
			var ligneAjout = parent.find('tr.ligneAjouterChamps');
			var data = parent.data('CTForm_dTable');
			
			if(data.etat == "modif")
			{
				var lePrecedent = parent.find('tr.LigneSel:first');
				
				if(lePrecedent.length > 0)
				{
					methods.Enregistrer(lePrecedent);
				}
			}
		},		
		update : function(content) { 
			// ...

		},
		afficherFonctions : function(parent, data) { 
			var lFonction = parent.find('tr.ligneFonction');
			
			if(data.etat == "table")
			{
				lFonction.find('input[name=btnAjouter]').show();
				lFonction.find('input[name=btnAnnuler]').hide();
				lFonction.find('input[name=btnModifier]').hide();
				lFonction.find('input[name=btnSupprimer]').hide();
			}
			else if(data.etat == "ajout")
			{
				lFonction.find('input[name=btnAjouter]').show();
				lFonction.find('input[name=btnAnnuler]').show();
				lFonction.find('input[name=btnModifier]').hide();
				lFonction.find('input[name=btnSupprimer]').hide();				
			}
			else if(data.etat == "modif")
			{
				lFonction.find('input[name=btnAjouter]').hide();
				lFonction.find('input[name=btnAnnuler]').show();
				lFonction.find('input[name=btnModifier]').show();
				lFonction.find('input[name=btnSupprimer]').show();
			}
		},		
		Supprimer_Click : function() {
			var parent = $(this).parents('table');
			var data = parent.data('CTForm_dTable');
			
			if(data.perm.Supprimer)
			{
				if(confirm('Supprimer?'))
				{
					var objLigne = data.rangCour;
					var strRequete = 'CTFormAction=supprimer';
					
					data.rangCour.find('td').each(function(){
						if($(this).attr('rel') && $(this).attr('rel') != '')
						{
							strRequete += '&' + $(this).attr('rel') + '=' + $(this).attr('title');
						}
					});
					

					$.ajax({
						url: data.action,
						async: true,
						type: "POST",
						data: strRequete,
						dataType: "json",
						success: function(data, textStatus, XMLHttpRequest) {
							if(data.resultat == 'ok')
							{		
								objLigne.remove();

								data.etat = 'table';
								data.rangCour = null;
								methods.afficherFonctions(parent, data);
								parent.data('CTForm_dTable', data);
							}
						}
					   }
					);
				}
			}
		}
	};
	

	$.fn.CTForm_dTable = function(method) 
	{
		if (methods[method]) 
		{
			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
		}
		else if (typeof method === 'object' || !method) 
		{
			return methods.init.apply(this, arguments);
		} 
		else 
		{
			$.error('Method ' + method + ' does not exist on jQuery.tooltip');
		}
	};

})(jQuery);


(function($){ 

	$.fn.CTFormFiller = function(options){
		var defaults = { 	display: true,
							option0: false,
							option0Text: '',
							chargerListes: false };
		
		var options = $.extend(defaults, options);

		var AffecterVal = function(data, textStatus, XMLHttpRequest) {
			if(data.resultat && data.resultat == 'ok')
			{
				var $this = $(this); 
				
				if(options.chargerListes)
				{
					for(var champ in data)
					{
						var leChamp = jQuery('select#' + champ + ':first');
						var $nOption = null;

						if(typeof data[champ] == 'object' && leChamp.length > 0)
						{
							if(options.option0)
							{
								leChamp.find('option[value!=0]').remove();
							}
							else
							{
								leChamp.find('option').remove();
							}

							for(rang in data[champ])
							{
								$nOption = jQuery('<option>' + data[champ][rang].label + '</option>');
								$nOption.attr('value', data[champ][rang].value);
								leChamp.append($nOption);
							}
						}
					}
				}
				else
				{
					$this.parents('form').find('input,select').each(function(index, Element){
						if(data[jQuery(Element).attr('name')])
							jQuery(Element).val(data[jQuery(Element).attr('name')]);
					});
				}
			}
		};
		var ChargerVal = function(event, ui) {
			var valParam = '';
			var $this = $(this);
			var strRequete = '';

			if((options && !options.confirmer) || confirm('Charger les informations?'))
			{
				if(options.event.indexOf('autocomplete') > -1 && ui)
					valParam = ui.item.id;
				else
					valParam = $this.val();
				
				if(options.params)
				{
					for(nom in options.params)
					{
						strRequete += '&' + $('#' + options.params[nom]).serialize();
					}
				}

				jQuery.ajax({cache: false, url: options.URL, dataType: 'json', data: options.nomParam + '=' + valParam + strRequete, success: function(data) { AffecterVal(data); }});
			}
		};
		
		return this.each(function(index) {
			var $this = $(this); 
			$this.bind(options.event, ChargerVal);
		});
	};

})(jQuery);

function CTForm_remplirListe(data, option0)
{
	for(var champ in data)
	{
		var leChamp = jQuery('select#' + champ + ':first');
		var $nOption = null;

		if(typeof data[champ] == 'object' && leChamp.length > 0)
		{
			if(option0)
			{
				leChamp.find('option[value!=0]').remove();
			}
			else
			{
				leChamp.find('option').remove();
			}

			for(rang in data[champ])
			{
				$nOption = jQuery('<option>' + data[champ][rang].label + '</option>');
				$nOption.attr('value', data[champ][rang].value);
				leChamp.append($nOption);
			}
		}
	}
}

function CTForm_ChargerForm(strUrl, strParams, idForm)
{
	jQuery.ajax({cache: false, type: 'post', url: strUrl, dataType: 'json', data: strParams, success: function(data) { 
		if(data.resultat && data.resultat == 'ok')
		{
			var $this = $(this); 
			if(data[0] != undefined)
			{
				$('#' + idForm).find('input,select,textarea').each(function(index, Element){
					if(data[0][jQuery(Element).attr('name')] != undefined)
					{
						// Ajouter pour les choix d'images
						if(jQuery(Element).attr('type') == 'checkbox' || jQuery(Element).attr('type') == 'radio')
						{
							if(jQuery(Element).attr('value') == data[0][jQuery(Element).attr('name')])
								jQuery(Element).attr('checked', 'checked');
						}
						else if(jQuery(Element).attr('type') == 'password')
						{
						
						}
						else
						{
							jQuery(Element).val(data[0][jQuery(Element).attr('name')]);
						}
					}
				});
			}
		}
	}});
}

/*(function($) {
	var config = {};

	var global = {
		selected : '',
		selector : ''
	};
	var init = $.prototype.init;

	$.prototype.init = function(selector, context) {
		var r = init.apply(this, arguments);

		if (selector && selector.selector)
			r.context = selector.context, r.selector = selector.selector;

		if (typeof selector == 'string') {
			r.context = context || document, r.selector = selector;
			global.selector = r.selector;
		}

		global.selected = r;

		return r;
	};

	$.prototype.init.prototype = $.prototype;

	$.fn.CTFormFiller = {
		config : function(args) {
			setConfig($.extend( {
				'default' : 'value',
				_this : global.selected,
				_obj : this
			}, args));
			return (getConfig());
		},
		
	};

	function setConfig(value) {
		config = value;
	}

	function getConfig() {
		return config;
	}
})(jQuery);*/
