/*
 * gForm for jQuery
 *
 *
 * $Date: 09/04/2009 13:49 $
 *
 *appel : $("form").gforms(p);
 *
 * p est l'objet de config Optionnel, et qui par defaut contient
 *p =
 *	{
 *		control:{
 *			etat:true,
 *			indicateur:'*',
 *			message:'Champs de saisie obligatoire',
 *			specifique: {
 *				mail : {
 *					class:'Mail',
 *					regExp:new RegExp("^[a-z0-9\-_]+[a-z0-9\.\-_]*@[a-z0-9\-_]+\.[a-z\.\-_]{1,}[a-z\-_]+$","gi"),
 *					info:"L'email doit être de type xxxxxx@xxxx.xx"
 *				},
 *				url : {
 *					class:'Url',
 *					regExp:new RegExp("^[a-z0-9\-_]+\.[a-z0-9\-_]+\.[a-z]{2,4}$","gi"),
 *					info:"L'adresse doit être de type xxx.xxxxxxxxxxx.xx",
 *					particule:"http://"
 *				}
 *			}
 *		},
 *		help:{
 *			etat:true,
 *			indicateur:'?',
 *			message:'Informations supplémentaires'
 *		}
 *	}
 *
 *
 */
	
	(function($){
	$.gform = function(f,p) {
			var p = $.extend({
				control:{
					etat:true,
					indicateur:'*',
					message:'Champs de saisie obligatoire',
					specifique: {
						mail : {
							className:'Mail',
							regExp:new RegExp("^[a-z0-9\-_]+[a-z0-9\.\-_]*@[a-z0-9\-_]+\.[a-z\.\-_]{1,}[a-z\-_]+$","gi"),
							info:"L'email doit être de type xxxxxx@xxxx.xx"
						},
						url : {
							className:'Url',
							regExp:new RegExp("^[a-z0-9\-_]+\.[a-z0-9\-_]+\.[a-z]{2,4}$","gi"),
							info:"L'adresse doit être de type xxx.xxxxxxxxxxx.xx",
							particule:"http://"
						}
					}
				},
				help:{
					etat:true,
					indicateur:'?',
					message:'Informations supplémentaires'
				}
			  }, p);
			var g={
				main:function () { /* main */
					g.base();
					if(p.help.etat) g.help();
					if(p.control.etat) g.control();
				},
				base:function () { /* fonction base */
					f.addClass('gForm');
					for (var i=0;i<f[0].elements.length;i++)
					{
						$(f[0].elements[i])
							.wrap($(g.o0('span')).addClass('gForm_base'))
							.each(function () {
								a=$("label[for="+this.id+"]",f).wrap($(g.o0('span')).addClass('gForm_base'));
								this.gFormRef=$(a.parent('span').get(0));
								if(this.checked) this.gFormRef.addClass("checked");
								if(a.length>0)a.get(0).gFormRef=$(g.oP(this));
							})
							.mouseover(function () {g.EvtTrans(this,'over',true);})
							.mouseout(function () {g.EvtTrans(this,'over',false);})
							.focus(function () {g.EvtTrans(this,'focus',true);})
							.blur(function () {	g.EvtTrans(this,'focus',false);})
							.keyup(function () {if ($(this).hasClass('obligatoire') && p.control.etat)g.functControl(this);})
							.click(function () {
								if(this.type=="radio") {
									$("input[name="+this.name+"]",f).each(function () {$(this.gFormRef).removeClass("checked");});
									$(this.gFormRef).addClass("checked");
								}
								if(this.type=="checkbox") {
									if(this.checked) $(this.gFormRef).addClass("checked");
									else $(this.gFormRef).removeClass("checked");
								}
							});
						$("label",f)
							.mouseover(function () {g.EvtTrans(this,'over',1);})
							.mouseout(function () {g.EvtTrans(this,'over',0);});
					}
				},
				control:function () {/* fonction de gestion de control */
					a=$(".obligatoire",f);
					a.each(function () {$("label",this.gFormRef).append($(g.o0('span')).addClass('obli').html(p.control.indicateur));});
					for(k in p.control.specifique)
					{
						b=p.control.specifique[k];
						$("."+b.className).each(function () {
							$(g.oP(this)).append($(g.o0('span')).addClass('message').html(b.info));
							if(b.particule) $(g.oP(this)).prepend($(g.o0('span')).addClass('particule').html(b.particule));
						});
					}
					if(a.length>0) f.append($(g.o0('p')).addClass('legend').html(p.control.message).prepend($(g.o0('span')).addClass('obli').html(p.control.indicateur)));
					f.submit(function () {return g.functSubmit(true);});
				},
				help:function () {/* fonction de gestion des aides */
					for (var i=0;i<f[0].elements.length;i++)
					{
						$(f[0].elements[i])
							.each(function () {
								var text = $(this).attr("title");
								if(text != "") {
									$(this).attr("title", "");
									$(g.oP(this)).append($(g.o0('span')).addClass('GToolTip')
											.append($(g.o0('span')).addClass('gToolTipBt info').html(p.help.indicateur))
											.append($(g.o0('span')).addClass('gToolTipText').hide().html(text))
									);
								}
							});
					}
					a=$(".gToolTipBt",f);
					a.mouseover(function (e) {
							var tipX = e.pageX + 15;var tipY = e.pageY + 15;
							$(".gToolTipText",$(this).parent()).css("left", tipX).css("top", tipY).show();
						})
						.mouseout(function () {$(".gToolTipText",$(this).parent()).hide();});
					if(a.length>0) f.append($(g.o0('p')).addClass('legend').html(p.help.message).prepend($(g.o0('span')).addClass('info').html(p.help.indicateur)));
				},
				functSubmit:function (b) {/* fonction de controle du formulaire */
					c=$(".obligatoire:visible");
					var res=true;var first;
					for(var i=0;i<c.length;i++) res= g.functControl(c[i])&&res;
					for(k in p.control.specifique)res= g.functControlSpecifique(p.control.specifique[k])&&res;
					if(!res && b) $(first).trigger('focus');
					return res;
				},
				functControl:function (o) {/* controle l'élément o */
					if((o.NodeName=="select" && o.selectedIndex<1)||(o.value=="")) {$(g.oP(o)).addClass('control');o.gFormRef.addClass('control');return false;}
					else{$(g.oP(o)).removeClass('control');o.gFormRef.removeClass('control');return true;}
				},
				functControlSpecifique:function (s) {/* controle les éléments spécifiques */
					a=$("."+s.className);
					res=true;
					for (var i=0;i<a.length;i++)
					{
						o=a.get(i);
						if(o.value!="" || $(o).hasClass('obligatoire')) {
							if(o.value.match(s.regExp)) $(g.oP(o)).removeClass('control');
							else {$(g.oP(o)).addClass('control');res=false;}
						}
					}
					return res;
				},
				o0:function(s){return document.createElement(s);}, /* créateur d'éléments */
				oP:function(s){return $(s).parent('span').get(0);}, /* Recuperateur de span base */
				/* transmission d'evenement */
				EvtTrans:function(o,c,b) {if(b) {o.gFormRef.addClass(c);$(g.oP(o)).addClass(c);}else {o.gFormRef.removeClass(c);$(g.oP(o)).removeClass(c);}}
			};
			g.main();
		}
	})(jQuery);
	
	$.fn.gforms=function () {$(this).each(function () {$.gform($(this));});};
