
		/*
		
			Un popin peut contenir plusieurs form;
			mais chaque form peut contenir plusieurs etapes
		*/
		// Class POPIN
		Popin = new Class.create();
	
		Popin.prototype = {
			self:{
				obj:false,
				id:false,
				className:false,
				style:false
			},
			opener:{
				obj:false,
				path:false
			},
			error:{
				id:"message_erreur",
				className:"error",
				check_etape:false
			},
			pointer:$$("body")[0],
			background: {
				obj:false,
				id:false
			},
			button:{
				open:{
					obj:false
				},
				close:{
					obj:false,
					className:false
				},
				etape:{
					className:false
				}
			},
			loading:{
				method:"get",
				img:false,
				url:false,
				param:false,
				encoding:'UTF-8',
				init:false
			},
			form:new Array(),
			form_active:{		
				indice:false,
				obj:false,
				etape:false
			},
			initialize:function(globalObj,popinObj,chargementInfo,formInfo) {
				var ref = this;
				
				// 1. initialisation des variables
				this.opener = {
					obj:$$(globalObj.bloc),
					path:globalObj.bloc
				}
				this.self = {
					obj:$(popinObj.popin.id),
					id:popinObj.popin.id
				};
				
				if(popinObj.error != null && popinObj.error != undefined) {
					this.error = {
						id:popinObj.error.id,
						className:popinObj.error.className,
						check_etape:(popinObj.error.check_etape != undefined)?popinObj.error.check_etape:false
					};
					
				}
				
				// 2. Si le container existe dans la page
				if(this.opener.obj) {
					ref.self.className = popinObj.popin.className;
					ref.background = {id:popinObj.popin.bg};
											
					// BOUTONS
					ref.button.open = {
						obj:$$(ref.opener.path+" ."+globalObj.className)
					};
					ref.button.close = {
						className:popinObj.button.close
					};
					ref.button.etapes = {
						className:popinObj.button.className
					};
					
					// AJAX: chargement de la popin
					if(chargementInfo != undefined && chargementInfo != false) {
						if(chargementInfo.method != undefined) ref.loading.method = chargementInfo.method;
						if(chargementInfo.img != undefined) ref.loading.img = chargementInfo.img;
						if(chargementInfo.url != undefined) ref.loading.url = chargementInfo.url;
						if(chargementInfo.param != undefined)	ref.loading.param = chargementInfo.param;
						if(chargementInfo.encoding != undefined) ref.loading.encoding = chargementInfo.encoding;
						if(chargementInfo.init != undefined) ref.loading.init = chargementInfo.init;
					}
					// 3. on met active les liens vers les popins
					if(ref.button.open.obj.length > 0) {	
						if(formInfo != undefined) ref.set_popin(formInfo);
						else ref.set_popin();
					}
				}
			},
			set_popin:function(formInfo) {
				// Ouverture de la Popin
				var ref = this;
										
				this.button.open.obj.each(function(myLink,a) {
					myLink.onclick = function() { return false;}
					Event.observe(myLink, 'click', function(){															
						ref.loading.url = myLink.getAttribute("href");
						ref.pointer = $$("body")[0];
												
						//1. on ajoute le layer du fond
						if(!$(ref.background.id)) {
							var myPopin_bg = document.createElement('div');
							myPopin_bg.setAttribute("id",ref.background.id);
							ref.pointer.insertBefore(myPopin_bg,ref.pointer.firstDescendant());
							
							ref.background.obj = $(ref.background.id);
						}
						
						//2. Chargement de la page
						new Ajax.Request(ref.loading.url, {
							method: ref.loading.method,
							encoding:ref.loading.encoding,
							onLoaded: function() {
								//alert("Début du chargement");
							},
							onComplete: function(msg) {
								//alert("Fin du chargement");
							},
							onFailure: function(msg) {
								//alert("Erreur");
							},
							onSuccess: function(msg) {

								if($(ref.self.id) == null) {
									// insertion du contenu	
									ref.create_tag({
										tagName:"div",
										id:ref.self.id,
										className:ref.self.className,
										before:ref.background.obj.next(),
										parent:ref.pointer,
										content:msg.responseText
									});
																
									// on active la fermeture du popin
									ref.self.obj = $(ref.self.id);
									ref.close();
									
								};	
								
								// on active le formulaire
								if(formInfo != undefined) {
									ref.form = formInfo;
									ref.active_form(0);
									ref.active_button();
								}
								
								//Ajout Max 1/12/08
								//Dans le cas d'ouverture de popin pour le CheckOut, on affecte la popin de chargement
								//sur les boutons de class=WsLauncher
								//affectLoaderOnClick('.WsLauncher');
								//Fin Ajout Max 1/12/08
								
								// fction du chargement
								ref.loading.init(ref)
							}
						});
					});
				})
			},
			get_indice_form:function(myId) {
				var valReturn = false;
				this.form.each(function(myForm,f) {
					if(myForm.id == myId) {
						valReturn = f;
					}
				});
				return valReturn;
			},
			get_indice_step:function(myId) {
				var valReturn = 0;
								
				// on parcours ttes les etape du form Cur
				if(myId != null) {
					this.form_active.obj.getElementsBySelector($(myId).tagName.toLowerCase()).each(function(etape,i) {
						if(etape.getAttribute("id") == myId) valReturn = i;
					});
				}
				
				return valReturn;
			},
			active_button:function() {
				/*
					active ts les liens autres que SUBMIT 
					(plusieurs ecrans dans 1 form)
				*/
				var ref = this;
				var btn = this.form_active.obj.getElementsBySelector("."+this.button.etapes.className);
				if(btn != undefined) {
					btn.each(function(myButton,i) {
						myButton.onclick = function() {return false;}
						Event.observe(myButton, 'click', function(){
							ref.goto_etape(myButton.hash)
						});
					});
				}
			},
			goto_etape:function(idVal) {
				if($$(idVal)[0] != undefined) {
					$$(idVal)[0].siblings().each(function(etape,i) {etape.hide()});
					$$(idVal)[0].show();
					
					this.form_active.etape = this.get_indice_step(idVal.split("#")[1]);
				}
			},
			init_form:function(indiceForm) {
				var myForm = this.form[indiceForm];
				this.form_active = {
					indice:indiceForm,
					obj:$(myForm.id),
					method:$(myForm.id).getAttribute("method"),
					action:$(myForm.id).getAttribute("action"),
					url:myForm.url,
					param:"",
					encoding:'UTF-8',
					button:$(myForm.id).getElementsBySelector("input[type='image']")[0],
					etape:0
				};
				
				// on masque / affiche les form nécessaires
				this.form_active.obj.siblings().each(function(form,f) {form.hide();})
				this.form_active.obj.show();
			},
			active_form:function(indiceForm,myInfo) {
				/*
					Comportement du formulaire:
					1. Validation 
					2. Erreur
				*/
				var ref = this;
				//console.log("Result1 :: "+arguments);
				if($(ref.form[indiceForm].id) != null) {
					//initialisation FORM
					this.init_form(indiceForm*1);
					
					// lien BACK
					ref.form_active.obj.getElementsBySelector(".back").each(function(myLink,i) {
						myLink.onclick = function() {return false;}
						Event.observe(myLink, 'click', function(){	
							//RE-initialisation FORM
							var indice_back = ref.get_indice_form(myLink.hash.split("#")[1]);
							ref.set_error(false);
							ref.init_form(indice_back*1);
						});
					});
					// fonction au chargement
					if(ref.form[indiceForm].init != undefined) ref.form[indiceForm].init(myInfo);

					// validation du formulaire
					ref.form_active.obj.onsubmit = function() { return false;}
					Event.observe(ref.form_active.obj, 'submit', function(){	
						ref.form.param = Form.serializeElements(ref.form_active.obj.getElements());
						
						new Ajax.Request(ref.form_active.action, {
							method: ref.form_active.method,
							parameters:ref.form.param,
							encoding:ref.form_active.encoding,
							onLoaded: function() {
								//console.log("Début du chargement");
							},
							onComplete: function(msg) {
								//console.log("Fin du chargement");
							},
							onFailure: function(msg) {
								//console.log("Erreur");
							},
							onSuccess: function(msg) {
								
								if(msg.responseText.strip() == "ok" || msg.responseText.evalJSON().valide == true) {
									if(ref.form_active.url) {
										// Validation finale
										ref.form_active.obj.setAttribute("action",ref.form_active.url);
										ref.form_active.obj.submit();
									} else {
										// étape suivante
										ref.set_error(false);
											
										// la rponse renvoie des infos en plus, pour l'tape suivante	
										ref.active_form(
											ref.form_active.indice*1+1,
											(msg.responseText != "ok") ? msg.responseText.evalJSON().question: false
										);
									}
								} else {
								//popin voucher
									if($('message_erreur2'))
										$('message_erreur2').update(msg.responseText.evalJSON().message);
									
									ref.set_error(msg.responseText.evalJSON());
									//Dans le cas d'une erreur, la popin n'est pas reloader et dans le cas d'un appel WS
									//la popinLoading ne sera donc pas fermer, il faut la fermer � la main.
									/*if ($('masqueLoading'))
										loadingClose();*/
								}
							}
						});						
					});
				}
			},
			create_tag:function(myObj) {
				// crée un élément avec un ID et un Contenu
				var elmt = document.createElement(myObj.tagName);
				elmt.setAttribute("id",myObj.id);
				myObj.parent.insertBefore(elmt,myObj.before);
				
				if(myObj.className != undefined) $(myObj.id).className = myObj.className;
				$(myObj.id).innerHTML = myObj.content;
			},
			set_error_message:function(msg,truc) {
				var ref = this; 

				//alert('ICI');
				var myTempEtape = this.form_active.obj.getElementsBySelector("fieldset")[0];
				//alert(this.error.id);		
				if(ref.error.check_etape) {
					if(truc != undefined) myTempEtape = truc;
					else myTempEtape = this.form_active.obj.getElementsBySelector("fieldset")[this.form_active.etape];	
				}
				//alert(myTempEtape);
				if(myTempEtape.descendants()[0].id == 'message_erreur2')
					myTempEtape.descendants()[0].update(msg);
					
				// Affiche le message d'erreur
				
				
				
				if(!$(this.error.id)) {
					this.create_tag({
						tagName:"div",
						id:this.error.id,
						className:this.error.className,
						before:myTempEtape.firstDescendant(),
						parent:myTempEtape,
						content:msg
					});
				}
				else {
					$(this.error.id).update(msg);
					//alert(msg);
				}
				;
				
				
				
				
			},
			set_error:function(response) {
				var ref = this;
				
				
				// réinitialise les champs
				this.form_active.obj.getElements().each(function(elmt,e) {
					elmt.up(0).removeClassName(ref.error.className)
				});
				
				// analyse de la réponse
				if(response) {				
					var myParent = false;	
					var myFirstEtape = false;
				
					response.champs.each(function(myChamps,i) {	
						ref.form_active.obj.getElementsBySelector("fieldset").each(function(etape,i) {
							if(etape.getElementsBySelector("[name='"+myChamps+"']")[0] != undefined) {
								if(!myFirstEtape) myFirstEtape = etape;
								
								myParent = etape.getElementsBySelector("[name='"+myChamps+"']")[0].up(0);
								myParent.addClassName(ref.error.className);
							}
						});
					});
					
					ref.form_active.etape = ref.get_indice_step(myFirstEtape.getAttribute("id"));
				
					/*
						(si le formulaire contient plusieurs etapes)
						on passe au 1er step qui contient des erreurs 
					*/
					if(ref.error.check_etape) ref.goto_etape("#"+myFirstEtape.getAttribute("id"));
					
				
					// affichage du message d'erreur
					this.set_error_message(response.message,myFirstEtape);	
					
				/* End Modifs DEV 07 Jan*/
					
				} else {
					//console.log("On efface le msg d'erreur");
					if($(ref.error.id) != null) $(ref.error.id).remove();
					ref.form_active.obj.getElementsBySelector("."+ref.error.className).each(function(field,i){
						field.removeClassName(ref.error.className);
					});
				}
					
			},
			close:function() {
				// action du boton CLOSE
				var ref = this;
				
				$$("."+this.button.close.className).each(function(btn_close,i) {
					btn_close.onclick = function() { return false;}
					Event.observe(btn_close, 'click', function(){
						ref.self.obj.remove();				
						ref.background.obj.remove();	
					});
					//alert('ther');
						if($('img_zoom')){
						//alert('this');
						Event.observe($('img_zoom'), 'click', function(){
							ref.self.obj.remove();				
							ref.background.obj.remove();	
					});
					}
				});
			}
		};
		