/*
 * jQuery AJAX Automation
 * Copyright 2008 Emmanuel CROMBEZ
 * Released under and GPL licenses.
 *
 * dynajax permet de mettre en place un service ajax tout en gardant un systeme sans.
 * on utilise les liens classiques avec le tag <A> en ajoutant un attribut 'ajax' à 'on'.
 *
 * Par exemple :
 *
 * <div> <a ajax='on' href='mon.cgi'>un simple lien</a> </div>
 * <script> $('body').dynajax(); </script>
 *
 * La node parent du lien recevra la contenu de la requete...
 *
 * Si vous voulez que le lien ne soit pas détruit, il suffit d'ajouter un attribut 'ajaxid' comme cela:
 *
 * <a ajax='on' ajaxid='celle-la' href='mon.cgi'>un simple lien</a>
 * <div id='celle-la'></div>
 * <script> $('body').dynajax(); </script>
 * 
 *  Ainsi client sans javascript (comme le robot de google) arrive à suivre tous les contenus.
 *  Evidemment, il vaut mieux que les CGI tiennent compte du parametre AJAX=on que nous avons ajouter
 * pour mettre une vrai page HTML autour du contenu. Mais cela fonctionne sans.
 *
 * TODO rename dynajax() en ajax_load() plus logique avec ajax_update()
 */

jQuery.fn.dynajax = function() {
	$(this).find("a[ajax='on']").each( function() {
		var href   = $(this).attr('href');
		var ajaxid = $(this).attr('ajaxid') || $(this).parent();

		href += (href.search(/[?]/)==-1)?'?AJAX=on':'&AJAX=on';

		if( $(this).attr('ajax_hash')=='on' && location.hash )
			href += (href.search(/[?]/)==-1) ?  location.hash.replace(/#/,"?") : location.hash.replace(/#/,"&");

		$(ajaxid).hide().load(href,undefined,function(s,t,f){ $(ajaxid).fadeIn('fast') });

		return true;
		});
	return this;
	};

/*
 * ajax_update() permet de mettre en place un appel ajax pour mettre a jour une node text
 *
 * <a href='update.pl' class='ajax_update'>La valeur a modifier</a>
 * <script> $('a.ajax_update').ajax_update(); </script> 
 * 
 * Si l'on click sur le <A>, on fait apparaittre un champ text on l'on peut modifier le texte.
 * Si l'on valide la modification, "update.pl?VALUE=La+nouvelle+valeure" sera appelé.
 * Si update.pl renvoi OK, la valeur sera mis à jour dans la page, sinon une alert() avec le texte renvoyé sera affichée.
 *
 * On entoure le tag A et les INPUT text button submit d'un FORM.ajax_update pour la CSS.
 */
jQuery.fn.ajax_update = function() {
	$(this).each( function() {

		var base  = this;
		var value = $(this).text();
		var href  = $(this).attr('href');

		$(this).wrap("<form onSubmit='return false;' class='ajax_update'></form>")
					 .after("<input type='button' class='button annuler'  value='Annuler'  style='display:none'/>")
					 .after("<input type='submit' class='submit modifier' value='Modifier' style='display:none'/>")
		       .after("<input type='text' class='text' value='' style='display:none'/>")
					 .click( function() { $(this).toggle().next().val( $(this).text()  ).toggle().next().toggle().next().toggle(); return false; } )
					 ;

		$(this).next().next().next().click( function() { /* Annuler */
					$(this).toggle().prev().toggle().prev().toggle().prev().toggle();
					} );

		$(this).next().next().click( function() { /* Modifer */
					$.get( href+((href.search(/[?]/)==-1)?'?VALUE=':'&VALUE=')+$(this).prev().val() , function(data) {
						if(data.substring(0,2)=='OK')
							{ $(base).text( $(base).next().val()  ); }
						else
							{ alert(data); }
						} );
					$(this).toggle().next().toggle();
					$(this).prev().toggle().prev().toggle();
					} );
		});
	return this;
	};

/*
 * ajax_delete() permet de mettre en place un appel ajax pour supprimer un objet
 *
 * <li id='id_objet'>un objet <a href='#id_objet' ajax_delete='delete.pl'>supprimer</a></li>
 * <script> $('a[ajax_delete]').ajax_delete(); </script> 
 * 
 * Si l'on click sur le <A>, delete.pl est appelé, et si le script renvoi "OK", le node #id_objet est supprimer de la page
 */

jQuery.fn.ajax_delete = function() {
	$(this).each( function() {

		var href      = $(this).attr('href');
		var supprime  = $(this).attr('ajax_delete');

		href += (href.search(/[?]/)==-1)?'?AJAX=on':'&AJAX=on';

		$(this).click( function() {
			if(confirm("Etes-vous sûr de vouloir supprimer ?"))
				{
				$.get( href ,
					function(data)
						{
						if(data.substring(0,2)=='OK') 
							$(supprime).remove();
						else 
							alert(data);
						}
					);
				}
			return false;
			} ) ;

		});
	return this;
	};

/*
 * ajax_select(url) permet de lire un fichier texte de façon à remplir les options d'un SELECT
 *
 * <select ajax_select='on' ajax_url='monfichier.csv'></select>
 * <script> $('select[ajax_select=on]').ajax_select(); </script> 
 * 
 * Le fichier monurl.txt va être lu en AJAX, puis chaque ligne sera inséré dans le SELECT sous la forme d'une option
 * dont le texte de l'option et la value sont identique.
 *
 * Si la ligne de texte contient une tabulation (séparateur de champ), le premier champ est la value et le deuxième le texte
 */

jQuery.fn.ajax_select = function() {
	$(this).each( function() {

		var select = this;
		var url    = $(this).attr('ajax_url');

		$.get(url, function(data) {
			var i;
			var line = data.split('\n');

			for(i=0;i<line.length;i++)
				{
				if(line[i].substring(0,1)!="#")
					{
					var f = line[i].split('\t');
	
					if(f.length == 2)
						select.options[select.options.length] = new Option(f[1],f[0]);
					else
						select.options[select.options.length] = new Option(line[i],line[i]);
					}
				}
			} );

		});
	return this;
	};


