/*
 * Script: formulaire.js
 * 	Contains <Form>
 * 	Contains <FormSection>
 * 	Contains <FormDiv>
 * 
 * License: copyright utopiaweb.fr
 * 
 * 
*/


/*
 * Class : Form
 */
 var Form = new Class({
 	initialize : function(options){
 		this.menu = $('onglets');
 		this.message = $E('p', 'messages');
 		this.buttonReset = $('resetButton');
 		this.initReset();
 		this.form = $('sections');
 		this.tableau = $('tableau');
 		this.tableauFx = new Fx.Slide(this.tableau , {duration : 500});
 		this.tableauFx.hide();
 		this.tableauScroll = new Fx.Scroll($(window), {duration : 500});
 		this.tableHtml = $('resultat');
 		this.onglets = new Array();
 		this.sections = new Array();
 		this.initMenu();
 		this.initSections();
 		this.current = 1;
 		this.onglets[1].setCurrent(true);
 		this.onglets[1].setVisible(true);
 		this.sections[1].setVisible(true);
 		this.currentSection = this.sections[1];
 	},
 	initMenu : function(){
 		var count = 1;
 		$ES('a', this.menu).each(function(onglet){
 			elt = $(onglet);
 			this.onglets[count]=new FormOnglet(this, onglet, count);
 			count++;
 		}.bind(this));
 	},
 	initSections : function(){
 		var count = 1;
 		$ES('.section', this.form).each(function(formDiv){
 			this.sections[count]=new FormSection(this, formDiv, count);
	 		count++;
 		}.bind(this))
 	},
 	initReset : function(){
 		this.buttonReset.addEvent('click', function(event){
 			e = new Event(event).stop();
 			ajaxReset = new Ajax(
 				'/ajax/reset.php',
 				{
 					method : 'get',
 					onComplete : this.reload.bind(this)
 				}
 			).request();
 		}.bind(this));
 	},
 	reload : function(){
 		window.location.reload();
 		this.sections.each(function(section){
 			section.reset();
 		}.bind(this));
 	},
 	setTableauVisible : function(visible){
 		this.tableauFx.stop();
 		if(visible){
 			this.tableauFx.slideIn().chain(function(){
 				//this.tableauScroll.toBottom();
 				this.tableauScroll.toElement('tableau');
 			}.bind(this));
 			if($('meilleurtaux')){
	 			$('meilleurtaux').removeClass('displayNone');
	 		}
 		}else{
 			this.tableauFx.slideOut();
 		}
 	},
 	setSection : function(section, valid, autonext){
		// Validation demandée si valid = false
		if(section>this.sections.length-1){
			section = this.sections.length-1;
		}
 		if(valid || this.sections[this.current].validate(false, autonext)){
 			// Affichage des autres
 			if(this.current<(this.sections.length-1)){
 				this.onglets[this.current+1].setVisible(true);
 			}
			// Disparition
 			this.sections[this.current].setVisible(false);
 			this.onglets[this.current].setCurrent(false);
 			// Affichage du nouveau
 			this.current = section;
 			this.sections[this.current].setVisible(true);
 			this.onglets[this.current].setCurrent(true);
 			this.onglets[this.current].setVisible(true);
 		}
 	},
 	setMessage : function(message){
 		if(message == ''){
 			this.message.setStyle('opacity', 0);
 		}
 		else{
 			if(!this.message.fx){
 				this.message.fx = new Fx.Style(this.message, 'opacity', {duration : 4000});
 			}
 			this.message.fx.stop();
 			this.message.fx.start(1,0);
 			this.message.setText(message);
 		}	
 	}
 });
Form.implement(new Events, new Options);
 
 /*
 * Class : FormOnglet
 */
 var FormOnglet = new Class({
 	initialize : function(form, onglet, id){
 		this.form = form;
 		this.onglet = onglet;
 		this.id = id;
 		this.initEvents();
 	},
 	initEvents : function(){
 		this.onglet.addEvent('click', function(event){
			var ev = new Event(event); 
			ev.stop();
			if(!(this.onglet.hasClass('current') || this.onglet.hasClass('disabled') )){  //
				// Section en cours non validée
				// Autonext : false
				this.form.setSection(this.id, false, false);
			}
 		}.bind(this));
 	},
 	setCurrent : function(current){
 		if(current){
 			this.onglet.addClass('current');
 		}
 		else{
 			this.onglet.removeClass('current');
 		}
 	},
 	setVisible : function(visible){
 		if(visible){
 			this.onglet.removeClass('disabled');
 		}
 		else{
 			this.onglet.addClass('disabled');
 		}
 	}
 });
 FormOnglet.implement(new Events, new Options);
 
/*
 * Class : FormSection
 */
 var FormSection = new Class({
 	initialize : function(form, section, id){
 		this.section = section;
 		this.formulaire = $E('form', this.section);
 		this.form = form;
 		this.id = id;
 		this.formDivs = new Array();
 		this.initFormDivs();
 		this.initButtons();
		this.reset();
 	},
 	reset : function(){
 		this.formulaire.reset();
 	},
 	setVisible : function(visible){
 		if(visible){
 			this.section.removeClass('displayNone');
 			mooFirstArray = new Array();
 			mooFirstArray = $ES('input', this.formulaire);
 			if(mooFirstArray.length > 0 && this.id != 5){ //
 				mooFirstArray[0].focus();
 			}
 			else{
 				
 			}
 		}else{
 			this.section.addClass('displayNone');
 		}
 	},
 	initFormDivs : function(){
 		this.count = 1;
 		$ES('.formDiv', this.section).each(function(elt){
 			this.formDivs[this.count] = new FormDiv(elt);
 			this.count ++;
 		}.bind(this))
 	},
 	validate : function(refresh, autonext){
 		this.valide = true;
 		this.autonext = autonext;
 		this.formDivs.each(function(elt){
 			if(elt){
 				this.valide = elt.validate() & this.valide;
 			} 		
 		}.bind(this));
 		if(this.valide){
 			this.form.setMessage('');
 			if(refresh){
	 			// AJAX callback refresh
	 			this.formulaire.send({
					onFailure : this.ajaxError.bind(this),
					evalScripts : true,
					update : 'resultats',
					onComplete : this.ajaxValidRefresh.bind(this)
				});
	 			
	 		}else{
	 			// AJAX callback no-refresh
	 			this.formulaire.send({
					onFailure : this.ajaxError.bind(this),
					evalScripts : true,
					update : 'resultats',
					onComplete : this.ajaxValid.bind(this)
				});
	 		}
 		}else{
 			this.form.setMessage('Certains champs sont mal remplis');
 		}
 		return this.valide;
 	},
 	initButtons : function(){
 		this.formulaire.addEvent('submit', function(event){
 			var e = new Event(event).stop();
 			this.validate(false, true);
 		}.bind(this));
 		buttonValid = $E('a.valider', this.section);
 		if(buttonValid){
 			buttonValid.addEvent('click', function(event){
 				 			
	 			var e = new Event(event).stop();
	 			this.validate(false, true);
	 		}.bind(this));
 		}
 		this.buttonValid2 = $E('a.valider2', this.section);
 		if(this.buttonValid2){
 			this.buttonValid2.addEvent('click', function(event){
 				var e = new Event(event).stop();
 				if(!this.buttonValid2.hasClass('disabled')){
	 				this.validate(true, true);
 				}
	 		}.bind(this));
 		}	
 	},
 	ajaxValid : function(){
 		this.form.setTableauVisible(false);
 		if(this.autonext){
 			next = (this.id + 1) % 7;
 			if(next<1) next = 7;
 			this.form.setSection(next, true, this.autonext);
 		}
 	},
 	ajaxValidRefresh : function(){
 		this.form.setTableauVisible(true);
 		var ajaxMail = new Ajax(
			'/ajax/mail2.php', 
			{
				method : 'post',
				autoCancel : 'true'
			}
		);
		ajaxMail.request();
		$('validMail').setText('');
 	},
 	ajaxError : function(){
 		this.form.setMessage('Une erreur s\'est produite...');
 	}
 });
 FormSection.implement(new Events);

/*
 * Class : FormDiv
 */
 var FormDiv = new Class({
 	initialize : function(formdiv){
 		this.formDiv = $(formdiv);
 		this.initInfobulle();
 		this.p = $E('p.error', this.formDiv);
 		if(this.p) this.setError('');
 		this.initEvents();
 	},
 	setError : function(message){
 		if(message==''){
 			this.p.setStyle('opacity', 0);
 		}else{
 			this.p.setText(message);
 			this.p.setStyle('opacity', 1);
 		}
 	},
 	initEvents : function(){
 		// optgroup  radioGroup
 		this.radioGroup = $E('.radioGroup', this.formDiv);
 		this.inputTxts = $ES('input[type="text"]', this.formDiv);
 		if(this.inputTxts.length>0){
 			input1 = this.inputTxts[0];
 			input2 = this.inputTxts[1];
 			if($(input2)){
 				input2.addEvent('blur', function(event){
					this.validate()
				}.bind(this));
 			}else{
 				input1.addEvent('blur', function(event){
					this.validate()
				}.bind(this));
 			}
 		}
 	},
 	validate : function(){		
 		// formDiv disabled
 		if(this.formDiv.hasClass('disabled')){
 			return true;
 		}
 		// radioButton
 		if(this.radioGroup && this.radioGroup.hasClass('required')){
 			this.radios = $ES('input[type=radio]', this.radioGroup);
 			radio1 = this.radios[0];
 			radio2 = this.radios[1];
 			radio3 = this.radios[2];
 			radio4 = this.radios[3];
 			valid = false;
 			if(radio1 && radio1.checked){
 				valid = true;
 			}
 			if(radio2 && radio2.checked){
 				valid = true;
 			}
 			if(radio3 && radio3.checked){
 				valid = true;
 			}
 			if(radio4 && radio4.checked){
 				valid = true;
 			}
 			if(valid){
 				this.setError('');
 				return true;
 			}else{
 				this.setError('Champ obligatoire');
 				return false;
 			}	
 		}
 		// inputText
 		else if(this.inputTxts.length > 0){
 			// input1
 			input1 = this.inputTxts[0];
 			input2 = this.inputTxts[1];
 			valid = true;
 			ExpressionNum = new RegExp('^[0-9]+$');
 			ExpressionMail = new RegExp("^\\w[\\w+\.\-]*@[\\w\-]+\.\\w[\\w+\.\-]*\\w$", "gi");
 			if(input2){
 				if(input2.hasClass('required') && input2.value==''){
 					this.setError('Champ obligatoire');
 					valid = false;
 				}
 				if(valid){
 					input2.removeClass('error');
 					this.setError('');
 				}
 				else{
 					input2.addClass('error');
 				}
 			}
 			if(input1){
 				if(input1.hasClass('required') && input1.value==''){
 					this.setError('Champ obligatoire');
 					input1.addClass('error');
 					valid = false;
 				}
 				else if(input1.value!='' && input1.hasClass('numerique') && !ExpressionNum.test(input1.value)){
 					this.setError('Valeur numérique attendue');
 					input1.addClass('error');
 					valid = false;
 				}
 				else if(input1.value!='' && input1.hasClass('numerique') && input1.hasClass('minzero') && input1.value < 0){
 					this.setError('Valeur positive attendue');
 					input1.addClass('error');
 					valid = false;
 				}
 				else if(input1.value!='' && input1.hasClass('numerique') && input1.hasClass('minun') && input1.value < 1){
 					this.setError('Valeur > 1 attendue');
 					input1.addClass('error');
 					valid = false;
 				}
 				else if(input1.value!='' && input1.hasClass('numerique') && input1.hasClass('maxmillion') && input1.value > 1000000){
 					this.setError('Valeur < 1 000 000 attendue');
 					input1.addClass('error');
 					valid = false;
 				}
 				else if(input1.value!='' && input1.hasClass('numerique') && input1.hasClass('maxcentmille') && input1.value > 100000){
 					this.setError('Valeur < 100 000 attendue');
 					input1.addClass('error');
 					valid = false;
 				}
 				else if(input1.value!='' && input1.hasClass('mail') && !ExpressionMail.test(input1.value)){
 					this.setError('Adresse mail non valide');
 					input1.addClass('error');
 					valid = false;
 				}
 				if(valid){
 					input1.removeClass('error');
 					this.setError('');
 				}
 			}
 			return valid;	
 		}
 		// R.A.S.
 		else{
 			return true;
 		}
 	},
 	displayInfobulle : function(aide, infobulle){
 		x = aide.getLeft() - $('sections').getLeft() +286;
		y = aide.getTop() - $('sections').getTop() - 20;
		infobulle.setStyle('top',y);
		infobulle.setStyle('left',x);
		infobulle.removeClass('displayNone');	
		infobulle.setStyle('opacity', 0.8);
 	},
 	initInfobulle : function(){
 		this.aide = $E('a.aide', this.formDiv);
 		this.infobulle = $E('p.infobulle', this.formDiv);
 		if(this.aide && this.infobulle){
 			this.formDiv.addEvent('mouseenter', function(){
 				this.displayInfobulle(this.aide, this.infobulle);
 			}.bind(this));
 			this.formDiv.addEvent('mouseleave', function(){
 				this.infobulle.addClass('displayNone');	
 			}.bind(this));
// 			this.aide.addEvent('mouseenter', function(){
// 				this.displayInfobulle(this.aide, this.infobulle);
// 			}.bind(this));
// 			this.aide.addEvent('mouseleave', function(){
// 				this.infobulle.addClass('displayNone');	
// 			}.bind(this));
 			this.aide.addEvent('click', function(event){
 				var e = new Event(event);
 				e.stop();
 			}.bind(this));
 		}
 	}
 });
 FormSection.implement( new Events);

/*
 * Fonction : initSpecials
 * 
 * Gère les cas spéciaux
 * 
 * - MAJ des défauts selon co-emprunteur ou non
 * - MAJ visibles dans section Prêts Aidés
 * 
 */
function initSpecials(){
	// MAJ des defauts
	inputRevenuNetCoEmprunteur = $('inputRevenuNetCoEmprunteur');
	inputRevenuNetCoEmprunteur.addEvent('blur', function(event, inputRevenuNetCoEmprunteur){
		value = $('inputRevenuNetCoEmprunteur').value;
		if(value > 0){
			$('optionAssuranceCo100').selected = "selected";
			$('optionAssuranceCo0').selected = "";
		}else{
			$('optionAssuranceCo100').selected = "";
			$('optionAssuranceCo0').selected = "selected";
		}
	});
	
	
	// MAJ visibles
	moosiPTZ = $('siPTZ');
	moosiPTZ.setStyle('opacity', '0');
	
	moosiPP = $('siPP');
	moosiPP.setStyle('opacity', '0');
	
	moosiPTZouPP  = $('siPTZouPP ');
	moosiPTZouPP.setStyle('opacity', '0');

	
	$('inputCalculPTZ').addEvent('click', function(){
		displaySpecial(moosiPTZ, true);	
		displaySpecial(moosiPTZouPP, true);
	});
	$('labelCalculPTZ1').addEvent('click', function(){
		displaySpecial(moosiPTZ, true);	
		displaySpecial(moosiPTZouPP, true);
	});
	$('labelCalculPTZ2').addEvent('click', function(){
		displaySpecial(moosiPTZ, true);	
		displaySpecial(moosiPTZouPP, true);
	});
	$('inputCalculPTZnon').addEvent('click', function(){
		displaySpecial(moosiPTZ, false);
		if(moosiPP.getStyle('opacity') < 1){
			displaySpecial(moosiPTZouPP, false);
		}
	});
	$('labelCalculPTZ3').addEvent('click', function(){
		displaySpecial(moosiPTZ, false);
		if(moosiPP.getStyle('opacity') < 1){
			displaySpecial(moosiPTZouPP, false);
		}
	});
	
	$('inputCalculPP').addEvent('click', function(){
		displaySpecial(moosiPP, true);	
		displaySpecial(moosiPTZouPP, true);
	});
	$('labelCalculPP1').addEvent('click', function(){
		displaySpecial(moosiPP, true);	
		displaySpecial(moosiPTZouPP, true);
	});
	$('labelCalculPP2').addEvent('click', function(){
		displaySpecial(moosiPP, true);	
		displaySpecial(moosiPTZouPP, true);	
	});
	$('inputCalculPPnon').addEvent('click', function(){
		displaySpecial(moosiPP, false);	
		if(moosiPTZ.getStyle('opacity') < 1){
			displaySpecial(moosiPTZouPP, false);
		}
	});
	$('labelCalculPP3').addEvent('click', function(){
		displaySpecial(moosiPP, false);	
		if(moosiPTZ.getStyle('opacity') < 1){
			displaySpecial(moosiPTZouPP, false);
		}
	});
	
	moosiAccepte = $('siAccepte');
	if(moosiAccepte){
		moosiAccepte.setStyle('opacity', 0);
	}
	
	if($('inputAcceptEmprunteur')){
	$('inputAcceptEmprunteur').addEvent('click', function(){
		displaySpecial(moosiAccepte, true);	
	});
	$('labelAccept1').addEvent('click', function(){
		displaySpecial(moosiAccepte, true);	
	});
	$('labelAccept2').addEvent('click', function(){
		displaySpecial(moosiAccepte, true);	
	});
	$('inputAcceptEmprunteurnon').addEvent('click', function(){
		displaySpecial(moosiAccepte, false);
	});
	$('labelAccept3').addEvent('click', function(){
		displaySpecial(moosiAccepte, false);
	});
	}
	
	moosiPR = $('siPR');
	moosiPR.setStyle('opacity', '0');
	
	$('inputCalculPR').addEvent('click', function(){
		displaySpecial(moosiPR, true);	
	});
	$('labelCalculPR1').addEvent('click', function(){
		displaySpecial(moosiPR, true);	
	});
	$('labelCalculPR2').addEvent('click', function(){
		displaySpecial(moosiPR, true);	
	});
	$('inputCalculPRnon').addEvent('click', function(){
		displaySpecial(moosiPR, false);
	});
	$('labelCalculPR3').addEvent('click', function(){
		displaySpecial(moosiPR, false);
	});
	
}
function displaySpecial(div, display){
	if(display){
		div.setStyle('opacity', 1);
		$ES('.formDiv', div).each(function(elt){
			elt.removeClass('disabled');
		});
	}else{
		div.setStyle('opacity', 0);
		$ES('.formDiv', div).each(function(elt){
			elt.addClass('disabled');
		});
	}
}

function initButtons(){
	$$('a.buttonLink').each(function(link){
		link.fx = new Fx.Style(link, 'opacity').set(0.7);
		link.addEvent('mouseenter', function(){
			link.fx.set(0.9);
		}.bind(link));
		link.addEvent('mouseleave', function(){
			link.fx.set(0.7);
		}.bind(link));
	});
}

function initButtonMail(){
	var buttonMail = $('sendMail');
	buttonMail.addEvent('click', function(event){
		var e = new Event(event);
		e.stop();
		var ajaxMail = new Ajax(
			'/ajax/mail.php', 
			{
				method : 'post',
				autoCancel : 'true',
				evalScripts : 'true'
			}
		);
		ajaxMail.request();
	});
}

function initButtonPrint(){
	var buttonPrint = $('print');
	buttonPrint.addEvent('click', function(event){
		var e = new Event(event);
		e.stop();
		window.print();
	});
}

function initMentions(){
	$('docs').getElements('.toggler').each(function(toggler){
		var box = $(toggler.id.replace('lnk','div'));
		toggler.addEvent('mouseenter', function(e){
			box.removeClass('displayNone');
		});
		toggler.addEvent('mouseleave', function(e){
			box.addClass('displayNone');
		});
		toggler.addEvent('click', function(e){
			new Event(e).stop();
		});
	});
}


/* -------------------------------------------------------
DomReady
------------------------------------------------------- */
var form;
window.addEvent('domready', function(){
	$E('p', 'messages').setStyle('opacity', 0);
	form = new Form();
	initSpecials();
	initButtons();
	initButtonMail();
	initButtonPrint();
	initMentions();
});
