/**
 * affichage d'une image aléatoire dans l'entête du site
 */
var arTopImage = new Array();

for(i = 0; i <= 6 ; i++){
    arTopImage[i] = new Image();
    arTopImage[i].src = '/Html/Themes/Images/bann_img' + (i+1) + '.jpg';
}

//obtention d'un nombre aléatoire
function getRandom(cpt)
{
	var ranNum= Math.floor(Math.random() * cpt);
	return ranNum;
}

//affichage d'une image aléatoire dans l'entête du site
function LoadTopImage()
{
    which = getRandom(7) // il y a 4 images..
    $('imgTop').src = arTopImage[which].src;
}

LoadTopImage();

/**
 * Gestion des comportements du menu
 *
 */
var cls_Menu = Class.create({
    initialize : function(){
        this.arItems = document.getElementsByClassName('menu');
        this.prepareElements();
    },
    prepareElements: function(){
        var items = $A(this.arItems);
        items.each(
            function(item){
                item.onmouseover = function(){
                    if(ul = $('submenu_' + item.id.substr(4,2))) {
                    	ul.setStyle({'display' : 'block' });
                    }
                };
                item.onmouseout = function(){
                	if(ul = $('submenu_' + item.id.substr(4,2))) {
                    	ul.setStyle({display : 'none'});
                    }
                };
            }.bind(this)
        );
    }    
});

/**
 * Affichage dynamique du calendrier et des activités
 *
 */
var cls_Calendar = Class.create({
	
	/**
	 * Premier load de la page : le calendrier est construit puis affiché dans le div Calendar
	 * 
	 * @param boolean initialize
	 */
	initialize : function(){
		new Ajax.Updater('Calendar','/UI/ComplexControls/CclCalendar.php',{
			parameters : {intialize : true}
		});
		this.bindActivityList(null,null);
	},
	
	/**
	 * Si le div ActivitysBymonth (page des activités) est présent, on rempli la liste des activtés
	 * 
	 * @param string year
	 * @param string month
	 */
	bindActivityList : function (year, month) {
		if($('ActivitysByMonth')) {
			new Ajax.Updater('ActivitysByMonth','/Html/Php/activityList.php',{
				parameters : {year : year, month : month}
			});
		}
	},
	
	/**
	 * Changement de mois (clique de flèche droite ou gauche du calendrier)
	 * 
	 * @param string year
	 * @param string month
	 */
	getMonth : function(year, month) {
		new Ajax.Updater('Calendar','/UI/ComplexControls/CclCalendar.php',{
			parameters : {year : year, month : month}
		});
		this.bindActivityList(year, month);
	}
});


var cls_SearchForm = Class.create({
	initialize : function() {
		$('btnSearch').observe('click', function(e){
			Event.stop(e);
			if($F('sSearch')!=''){
				new Ajax.Updater('LeftBlock', '/WebMaestro/Modules/Search/SearchResult.php',{
						asynchronous:false,
						parameters:{sSearch:$F('sSearch')}
						});
			}
		}.bind(this));
		$('sSearch').observe('keypress',function(e){
			if (e.keyCode == Event.KEY_RETURN){
				Event.stop(e);
				if($F('sSearch')!=''){
					new Ajax.Updater('LeftBlock', '/WebMaestro/Modules/Search/SearchResult.php',{
						asynchronous:false,
						parameters:{sSearch:$F('sSearch')}
					});
				}
			}
		});
	}

});

var cls_NewsLetter = Class.create({
	initialize : function () {
		$('btnInfo').observe('click', function(e){
			Event.stop(e);
			if($F('sEmail')!=''){
				new Ajax.Updater('Subscribe', '/WebMaestro/Modules/NewsLetter/Subscribe.php',{
						asynchronous:false,
						parameters:{sEmail:$F('sEmail')}
						});
			}
		}.bind(this));
	}
});

/**
 * Classe créée pour gérer les comportements sur les différents formulaires d'inscription
 * @class cls_FormValidator
 *
 */
var cls_FormValidator = Class.create({
	
	/**
	* Contructeur de la classe : crée un observer sur le bouton submit, valide et soumet le formulaire 
	* créé également des oserver sur tous les  champs obligatoire et les place en jaune pale s'ils ne sont
	* pas remplis
	*
	*/
	initialize : function(){
		//récupération du type de formulaire: type 2, 3, 4 ou 5, 
		//dépendant du type d'activité, car les traitements et les validations diffèrent en fonction du type
 		//this.type = type;
 		
 		//tableau contenant les autres personnes inscrites à l'activité
 		this.others = new Array();
		
		//On cache le message d'erreur et la liste des autres personnes inscrites
		$('msgStack').hide();
		$('tableOthers').hide();
		

		//On bloque l'accès au formulaire tant que le email n'est pas entré
		var form = $('FrmRegistration');
		form['disable']();
		form.disabled = !form.disabled;
				
		//On place un observer sur le submit du formulaire
		$('FrmRegistration').observe('submit', function(e){
		  Event.stop(e);
		  if(this.validate()){
		  	$('FrmRegistration').request({
		  		onComplete : function(transport){
		  			$('divResponse').innerHTML = transport.responseText;
		  			return true;
		  		},
		  		parameters : {arOtherPeople : this.others.toJSON()}
		  	});
		  }
		}.bind(this));
		
		//On place un observer sur le bouton de la première inscription
		$('btnInfoByEmail').observe('click', function(e){
			if ($F('txtInfoByEmail') != '') {		
				new Ajax.Request('/Html/Php/personnalInfo.php',{
					parameters : {email : $F('txtInfoByEmail')},
					onSuccess : function (transport){
						$('FrmPersonnalInfo').hide();					
						form[form.disabled ? 'enable' : 'disable']();
						form.disabled = !form.disabled;
						var member = transport.responseText.evalJSON();
						$('txtFirstname').value = member.firstname;
						$('txtLastname').value  = member.lastname;
						$('txtBusiness').value = member.business;
						$('txtAddress').value = member.address;
						$('txtCity').value = member.city;
						$('txtZipCode').value = member.zip_code;
						$('txtPhone').value = member.phone;
						if(member.is_member) {
							$('rbIsMember_Y').checked = "checked";
						} else {
							$('rbIsMember_N').checked = "checked";
						}
						$('txtMemberId').value = member.id;
					}
				});
				$('txtEmail').value = $F('txtInfoByEmail');
				$('msgStack').hide();
			}
		});
		
		$('txtInfoByEmail').observe('keypress',function(e) {
			if (e.keyCode == Event.KEY_RETURN){
				Event.stop(e);
				new Ajax.Request('/Html/Php/personnalInfo.php',{
					parameters : {email : $F('txtInfoByEmail')},
					onSuccess : function (transport){
						$('FrmPersonnalInfo').hide();					
						form[form.disabled ? 'enable' : 'disable']();
						form.disabled = !form.disabled;
						var member = transport.responseText.evalJSON();
						$('txtFirstname').value = member.firstname;
						$('txtLastname').value  = member.lastname;
						$('txtBusiness').value = member.business;
						$('txtAddress').value = member.address;
						$('txtCity').value = member.city;
						$('txtZipCode').value = member.zip_code;
						$('txtPhone').value = member.phone;
						if(member.is_member) {
							$('rbIsMember_Y').checked = "checked";
						} else {
							$('rbIsMember_N').checked = "checked";
						}
						$('txtMemberId').value = member.id;
					}
				});
				$('txtEmail').value = $F('txtInfoByEmail');
				$('msgStack').hide();
			}
		});
		
		//On place un observer sur l'ajout des autres personnes inscrites à l'activité 
		$('btnAdd').observe('click', function(e){
			if(this.validateAddPerson(this.type)){
				this.addPerson();
			}
		}.bind(this));
		
		//On remet le bg du champs en blanc lors du focus
		$$('.required').invoke('observe','focus',function(e){
			e.element().style.backgroundColor = "#ffffff";
		});
		
		//On met le bg du champs en jaune s'il est obligatoire et non complété
		$$('.required').invoke('observe','blur',function(e){
			var item = e.element();
			if(item.value == ""){
				item.style.backgroundColor = "#e7e1d1";
			}		
		});
	},
	
	displayInfos : function() {
		new Ajax.Request('/Html/Php/personnalInfo.php',{
			parameters : {email : $F('txtInfoByEmail')},
			onSuccess : function (transport){
				$('FrmPersonnalInfo').hide();					
				form[form.disabled ? 'enable' : 'disable']();
				form.disabled = !form.disabled;
				var member = transport.responseText.evalJSON();
				$('txtFirstname').value = member.firstname;
				$('txtLastname').value  = member.lastname;
				$('txtBusiness').value = member.business;
				$('txtAddress').value = member.address;
				$('txtCity').value = member.city;
				$('txtZipCode').value = member.zip_code;
				$('txtPhone').value = member.phone;
				if(member.is_member) {
					$('rbIsMember_Y').checked = "checked";
				} else {
					$('rbIsMember_N').checked = "checked";
				}
				$('txtMemberId').value = member.id;
			}
		});
		$('txtEmail').value = $F('txtInfoByEmail');
		$('msgStack').hide();
	},
	
	/**
	 * Ajout d'une personne à la liste
	 *
	 */
	addPerson : function() {
		this.others.push(new Array($F('txtOtFn'),$F('txtOtLn'),$F('txtOtEnt')));
		$('txtOtFn').clear();
		$('txtOtLn').clear();
		$('txtOtEnt').clear();
		this.buildOthersTable();
	},
	/**
	 * Suppression d'une personne sur la liste
	 *
	 */
	removePerson : function(ind) {
		this.others.splice(ind,1);
		(this.others.length == 0) ? $('tableOthers').hide() : this.buildOthersTable();
	},
	
	/**
	 * Construction du tableau de la liste des personnes à l'aide d'un template
	 *
	 */
	buildOthersTable : function() {
		$('tableOthers').show();
		$('tbOthers').innerHTML = "";
		var i = 0;
		this.others.each(function(item){
			$('tbOthers').insert(new Template('<tr><td>#{firstname}</td><td>#{lastname}</td><td>#{company}</td><td><input class="btnMinus" type="button" onclick="_FormValidator.removePerson(#{ind})" /></td></tr>')
		    	.evaluate({
		      	firstname: item[0],
		      	lastname: item[1],
		      	company: item[2],
		      	ind : i
		    }), 'bottom' ); 
			i++;
		});
	},
	
	/**
	* Vérifie que tous les champs sont biens remplis. Si non, met le background en jaune pale et affiche un message
	* @return boolean 
	*/
	validate : function(){
		var valide = true;
		$('msgStack').innerHTML = "";
		
		//On fait le tour des champs obligatoire pour être sur q'ils sont remplis 
		$$('.required').each(function(item){
			item.style.backgroundColor = "#ffffff";
			if(item.value == ""){			
				item.style.backgroundColor = "#e7e1d1";
				valide = false;				
			}
		});
		
		if(!valide){ $('msgStack').innerHTML += "Vous devez  remplir tous les champs obligatoires (identifiés en beige)."; }
		
		//Validation du code postal
		if(valide && $('txtZipCode').present()) {
			valide = this.validateZipCode('txtZipCode');
		}
		
		//Validation du  numéro de téléphone à la maison
		if(valide && $('txtPhone').present()) {
			valide = this.validatePhone('txtPhone');
		}
		
		if(valide && $('txtEmail').present()) {
			valide = this.validateEmail('txtEmail');
		}
		
		if(valide) {
			valide = this.validateRegistration();
		}
		
		//Affichage des message d'erreur s'il y a lieu
		if(!valide){$('msgStack').show();}
			
		return valide;
	},
	
	validateRegistration : function () {
		if ( $('txtTableCount') == null ) {
			if( ! this.IsNumeric($F('txtPoepleCount')) ) {
				$('msgStack').innerHTML += "<br />Vous devez entrer une valeur numérique dans le champ Nombre de personnes \n";
				return false;
			}
		} else {
			if(!this.IsNumeric($F('txtPoepleCount')) && !this.IsNumeric($F('txtTableCount')) ) {
				$('msgStack').innerHTML += "<br />Vous devez entrer une valeur numérique dans le champ Nombre de personnes et/ou dans le champ Nombre de table \n";
				return false
			}
		}
		
		if($F('rbIsMember_Y') == null && $F('rbIsMember_N')== null) {
			$('msgStack').innerHTML += "<br />Vous devez spécifier si vous êtes membre de la chambre de commerce \n";
			return false;
		}
		
		return true;
	},
	
	validateAddPerson : function(type) {
		if(type == 5 && ! $('txtOtEnt').present()) {
			alert("Vous devez spécifier le nom de l'entreprise avant d'ajouter une participant à l'activité");
			return false;
		}
		if(! $('txtOtFn').present() ||  ! $('txtOtLn').present()) {
			alert("Vous devez spécifier le nom complet du participant avant de l'ajouter à l'activité");
			return false;
		}
		return true;
	},
	
	/**
	* Vérifie que le code postal a un format  valide (format américain et canadien)
	* @param control 
	* @return boolean 
	*/
	validateZipCode : function(control) {
		zip = $F(control)	
		//format américain
		if (zip.match(/^[0-9]{5}$/)) {
			return true;
		}
		//format canadien , avec et sans espace
		zip = zip.toUpperCase();
		if (zip.match(/^[A-Z][0-9][A-Z][0-9][A-Z][0-9]$/)) {
			return true;
		}
		if (zip.match(/^[A-Z][0-9][A-Z].[0-9][A-Z][0-9]$/)) {
			return true;
		}
		$('msgStack').innerHTML += "Le code  postal doit avoir  un format valide.";
		$(control).style.backgroundColor = "#e7e1d1";
		return false;
	},
	
	/**
	* Vérifie que le no de téléphone a un format  valide 
	* @param control 
	* @return boolean 
	*/
	validatePhone : function(control) {
	   
		if ($F(control).length < 12) {
			$('msgStack').innerHTML += "<br />Le numéro de téléphone <"+$F(control)+ "> n'a pas le bon format. Assurez-vous que le code régional est inclus et qu'il respecte le format 999-999-9999.\n";
	        $(control).style.backgroundColor = "#e7e1d1";
	        return false;
		}
		var stripped = $F(control).replace(/[\(\)\.\-\ ]/g, '');    
		var num = parseInt(stripped);
	   	
	   	if (!(stripped.length == 10)) {
	        $('msgStack').innerHTML += "<br />Le numéro de téléphone <"+$F(control)+ "> n'a pas la bonne longueur ou contient des caractères illégaux. Assurez-vous que le code régional est inclus et qu'il respecte le format 999-999-9999.\n";
	        $(control).style.backgroundColor = "#e7e1d1";
	        return false;
	    } else if (isNaN(num) || num  < 1000000000) {        
	        $('msgStack').innerHTML += "<br />Le numéro de téléphone <"+$F(control)+ "> contient des charactères illégaux.\n";
	        $(control).style.backgroundColor = "#e7e1d1";
	        return false;
	    }
	    return true;
	},
	
	/**
	* Vérifie que le courriel a un format valide
	* @param email 
	* @return boolean 
	*/
	validateEmail : function (email) {
		var reg = /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/;
		if (reg.exec($F(email)) != null ) {
			return true;
		}
		$(email).style.backgroundColor = "#e7e1d1"; 
		$('msgStack').innerHTML += "<br />Le email  <"+$F(email)+ "> n'a pas un format valide.\n";
		return false;
	},
	
	IsNumeric : function (strString) {
		var strValidChars = "0123456789";
		var strChar;
		var blnResult = true;

		if (strString.length == 0) return false;

		for (i = 0; i < strString.length && blnResult == true; i++) {
			strChar = strString.charAt(i);
			if (strValidChars.indexOf(strChar) == -1) {
				blnResult = false;
			}
		}
		return blnResult;
	}
});
//instanciation du menu
var _menu = new cls_Menu();
//instanciation du searchForm
var _SearchForm = new cls_SearchForm();