function setAllCheckBox(fieldName, checkValue, formId){
	if (formId) {
		$(formId).getInputs('checkbox',fieldName).each(function(elt){elt.checked=checkValue});
	} else {
		$$('input[type=\'checkbox\'][name=\''+fieldName+'\']').each(function(elt){elt.checked=checkValue});
	}
}

// -------------------------------------------------------------------------------------------------
// <summary>
// Constructeur d'objet élément de validation de formulaire
// </summary>
// <remarks>
// </remarks>
// <param name="elementId">Id de l'élément à valider</param>
// <param name="elementLabel">Label de l'élément à valider</param>
// <param name="type">type de contrôle : numeric, date, email, hyperlien, required. Si non défini, utilise la fonction verification</param>
// <param name="msg">Message à afficher en cas d'erreur</param>
// <param name="verification">Fonction de validation de l'élément</param>
// <return>-</return>
// -------------------------------------------------------------------------------------------------- 
function ValidationElement(elementId, elementLabel, type, message, verification){
	this.ElementId = elementId;
	this.ElementLabel = elementLabel;
	this.Type = type;
	this.Message = message;
	this.Check = verification;
}//ValidationElement

// -------------------------------------------------------------------------------------------------
// <summary>
// Constructeur d'objet de validation de formulaire
// </summary>
// <remarks>
// </remarks>
// <param name="checkList">Liste des éléments à valider (objet d'élément de validation)</param>
// <param name="summaryEltId">Id de l'élément pour affichage du résumé des erreurs</param>
// <param name="eltErrorStyleClass">Classe pour styler les éléments en erreur (optionnel)</param>
// <param name="eltErrorMsgClass">Classe pour afficher l'erreur à côté de l'élément (optionnel)</param>
// <return>-</return>
// --------------------------------------------------------------------------------------------------
function FormValidator(checkList, summaryEltId, eltErrorStyleClass, eltErrorMsgClass){
	this.CheckList = $A(checkList);
	this.Errors = $A();
	// Fonction permettant d'afficher le résumé des erreurs
	this.Summarize = function(){
		if($(summaryEltId)){
			$(summaryEltId).update('<span> '+this.Errors.size()+' erreur(s) rencontrée(s):</span>');				
			this.Errors.each(function(error){
				//console.info(error);
				new Insertion.Bottom($(summaryEltId), '<p>'+error.Message+'</p>');
				$(summaryEltId).show();
			});
		}
	}
	// Fonction de validation des éléments
	this.Check = function(){
		var tempErrors = $A();
		//boucle sur les éléments de validation de la checklist
		//et répertorie les erreurs s'il y a lieu
		this.CheckList.each(function(ve){
			//console.info(ve);
			//Suprression du style error sur tous les éléments
			$(ve.ElementId).removeClassName(eltErrorStyleClass);
			switch(ve.Type){
				case 'numeric':		
					if(!$F(ve.ElementId).match(/^(\d*)$/)) {
						(ve.Message != '') ? msg = ve.Message : msg = 'Le champ '+ve.ElementLabel+' est mal renseigné!';
						tempErrors = $A(tempErrors.concat({ElementId: ve.ElementId, Message: msg}));
					}
					break;
				case 'date':		
					if(!$F(ve.ElementId).match(/^(0[1-9]|[12]\d|3[01])[\-\s\/\.](0[1-9]|1[012])[\-\s\/\.](19|20)\d\d$/)) {
						(ve.Message != '') ? msg = ve.Message : msg = 'Le champ '+ve.ElementLabel+' est mal renseigné!';
						tempErrors = $A(tempErrors.concat({ElementId: ve.ElementId, Message: msg}));
					}
					break;
				case 'email':		
					if(!$F(ve.ElementId).match(/^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+/)) {
						(ve.Message != '') ? msg = ve.Message : msg = 'Le champ '+ve.ElementLabel+' est mal renseigné!';
						tempErrors = $A(tempErrors.concat({ElementId: ve.ElementId, Message: msg}));
					}
					break;
				case 'hyperlien':	
					if(!$F(ve.ElementId).match(/^((ht|f)tps?:\/\/.*)/)) {
						(ve.Message != '') ? msg = ve.Message : msg = 'Le champ '+ve.ElementLabel+' est mal renseigné!';
						tempErrors = $A(tempErrors.concat({ElementId: ve.ElementId, Message: msg}));
					}
					break;
				case 'required':	
					if(!$F(ve.ElementId)) {
						(ve.Message != '') ? msg = ve.Message : msg = 'Le champ '+ve.ElementLabel+' doit être renseigné!';
						tempErrors = $A(tempErrors.concat({ElementId: ve.ElementId, Message: msg}));
					}
					break;
				case 'more_than_required':	
					if(!$F(ve.ElementId) && (!ve.Check || !ve.Check())) {
						(ve.Message != '') ? msg = ve.Message : msg = 'Le champ '+ve.ElementLabel+' doit être renseigné!';
						tempErrors = $A(tempErrors.concat({ElementId: ve.ElementId, Message: msg}));
					}
					break;										
				default: 			
					if(!ve.Check || !ve.Check()) {
						tempErrors = $A(tempErrors.concat({ElementId: ve.ElementId, Message: ve.Message}));
					}
					break;
			}
			return ;
		});
		//enregistrement dans le répertoire global des nouvelles erreurs relevées
		this.Errors = $A(tempErrors).compact();
		//action sur GUI si erreurs relevées
		if(this.Errors.size()){
			//résumé des erreurs
			this.Summarize();
			if (eltErrorStyleClass || eltErrorMsgClass) {
				this.Errors.each(function(error){
					// Application de la classe sur l'élément en erreur si définie
					if (eltErrorStyleClass) {
						$(error.ElementId).addClassName(eltErrorStyleClass);
					}
					// Affichage de l'erreur sur l'élément en erreur si définie
					if(eltErrorMsgClass) {
						if(eltErrorMsgClass.include("after"))
							new Insertion.After($(error.ElementId), '<span class="'+eltErrorMsgClass+'">'+error.Message+'</span>');
						else
							new Insertion.Before($(error.ElementId), '<span class="'+eltErrorMsgClass+'">'+error.Message+'</span>');
					}
				});
			}
			//activation du premier champs incriminé
			$(this.Errors.first().ElementId).activate();
			//indique que la vérif comporte des erreurs
			return false;
		}else return true;
	};
    //indication visuelle pour les champs requis ou soumis à contrôle
	this.IndicateRequired = function(){
		this.CheckList.each(function(ve){
			if(ve.Type == 'required' || ve.Type == 'more_than_required')
				new Insertion.After($(ve.ElementId), '<span style="color:red;font-weight:bold;">*</span>');
			else
				new Insertion.After($(ve.ElementId), '<span style="color:yellow;font-weight:bold;">*</span>');				
		});
	}
}//FormValidator

function openEditForm(numclient){
	var decoration = 'width=500,height=450,menubar=no,scrollbars=no';
	window.open('edit_client.php?numclient='+numclient, 'form_edit_client', decoration);
}//openEditForm

function postSalleComment(idSalle, options){
	options = options || {};
	new Ajax.Request('/ajax/action_comment_salle.php', {
		method: 'post',
		parameters: 'ids='+idSalle+'&'+$('form_comment_salle'+idSalle).serialize()+((options.origin) ? '&origin='+options.origin : '')+((options.idOrigin) ? '&idOrigin='+options.idOrigin : ''),
		onSuccess: function(requester) {
			$('com_and_notes'+idSalle).update(requester.responseText);
			$('nb_com'+idSalle).update($F('hid_nb_com'+idSalle));
			new Effect.Highlight('com_and_notes'+idSalle);
		}
	});
}//postSalleComment

/**
* Fonction d'ajout d'une salle dans la sélection 
* idSalle : identifiant de la salle à sélectionner
* fiche : optionnel =1 pour fiche des salles
*/
function addSelection(idSalle, fiche, options) {
		options = options || {};
		new Ajax.Request('/ajax/action_selection.php', {
			method: 'post',
			parameters: 'action=add&ids='+idSalle+'&fiche='+fiche+((options.origin) ? '&origin='+options.origin : '')+((options.idOrigin) ? '&idOrigin='+options.idOrigin : ''),
			onSuccess: function(requester) {
				//$('mySelection').down('a').innerHTML = requester.responseText;
				eval(requester.responseText);
			}
		});
}//addSelection

/**
* Fonction de suppression d'une salle dans la sélection 
*/
function deleteSelection(idSalle, options) {
		options = options || {};
		new Ajax.Request('/ajax/action_selection.php', {
			method: 'post',
			parameters: 'action=delete&ids='+idSalle+((options.origin) ? '&origin='+options.origin : '')+((options.idOrigin) ? '&idOrigin='+options.idOrigin : ''),
			onSuccess: function(requester) {
				//$('mySelection').down('a').innerHTML = requester.responseText;
				eval(requester.responseText);
			}
		});
}//deleteSelection

/**
* Fonction de suppression d'une salle de ma sélection 
*/
function deleteMySelection(idSalle, options) {
		options = options || {};
		new Ajax.Request('/ajax/action_selection.php', {
			method: 'post',
			parameters: 'action=deleteMySelection&ids='+idSalle+((options.origin) ? '&origin='+options.origin : '')+((options.idOrigin) ? '&idOrigin='+options.idOrigin : ''),
			onSuccess: function(requester) {
				eval(requester.responseText);
			}
		});
}//deleteMySelection

/**
* Fonction d'ajout d'une salle dans la sélection 
* idSalle : identifiant de la salle à sélectionner
* fiche : optionnel =1 pour fiche des salles
*/
function addSelectionSalon(idSalle, fiche, options) {
		options = options || {};
		new Ajax.Request('/ajax/action_selection_salon.php', {
			method: 'post',
			parameters: 'action=add&ids='+idSalle+'&fiche='+fiche+((options.origin) ? '&origin='+options.origin : '')+((options.idOrigin) ? '&idOrigin='+options.idOrigin : ''),
			onSuccess: function(requester) {
				//$('mySelection').down('a').innerHTML = requester.responseText;
				eval(requester.responseText);
			}
		});
}//addSelection

/**
* Fonction de suppression d'une salle dans la sélection 
*/
function deleteSelectionSalon(idSalle, options) {
		options = options || {};
		new Ajax.Request('/ajax/action_selection_salon.php', {
			method: 'post',
			parameters: 'action=delete&ids='+idSalle+((options.origin) ? '&origin='+options.origin : '')+((options.idOrigin) ? '&idOrigin='+options.idOrigin : ''),
			onSuccess: function(requester) {
				//$('mySelection').down('a').innerHTML = requester.responseText;
				eval(requester.responseText);
			}
		});
}//deleteSelection

/**
* Fonction de suppression d'une salle de ma sélection 
*/
function deleteMySelectionSalon(idSalle, options) {
		options = options || {};
		new Ajax.Request('/ajax/action_selection_salon.php', {
			method: 'post',
			parameters: 'action=deleteMySelection&ids='+idSalle+((options.origin) ? '&origin='+options.origin : '')+((options.idOrigin) ? '&idOrigin='+options.idOrigin : ''),
			onSuccess: function(requester) {
				eval(requester.responseText);
			}
		});
}//deleteMySelection


// Gestion de l'affichage show/hide
function showHideElement(elementId) {
		if ($(elementId).visible()) {
			$(elementId).hide();
			$('img'+elementId).src = "/images/common/nolines_plus.gif";
		} else {
			$(elementId).show();
			$('img'+elementId).src = "/images/common/nolines_minus.gif";
		}
}

// Modification de l'image indiquant le toggle d'un élément
function togglePicto(img, img1, img2){
    pattern = /(((http:\/\/)|(https:\/\/))?([\.\-_a-zA-Z0-9]+\/)+)([\.\-_a-zA-Z0-9]+)/;
    img.src = img.src.sub(pattern,function(matches){
              var picto = ($A(matches).last()==img1)? img2 : img1;
              return matches[1]+picto;
          });
}//togglePicto

/*
* ajaxFormSubmissionHandler : requêteur et gestionnaire de réponse ajax générique pour la soumission de formulaire
* 
* @param dom_event : objet evenement automatiquement passé en 1er argument par Prototype
* @param requestHandlingModule (ou RHM) : module à implémenter renfermant les spécificités de la requête AJAX
* NB : Cette fonction suppose qu'une réponse bien formée du serveur (succès comme échec) soit un objet JSON
* 	   comportant une clé 'action_result' qui soit un booléen et une clé facultative 'report' qui sera affichée
*	   si elle est définie en cas de réponse négative ex: {"action_result":false, "report":'Le user n\'est pas connect&eacute;!'}
* @authors Nicolas MARY
* exemple de RHM : 
* 	var connectionRHM = {
*     reportTarget: $('server_report'),
*     url: './ajax/process_user_login.php',
*     params: function(){
*         return $('form_login_user').serialize()+'&client_form='+$('form_login_user').name;
*     },
*     success: function(){
*         this.reportTarget.update('<span class="success">Connexion effectuée!</span>');
*         window.location = 'view.php';
*     },
*     failure: function(){
*         if($A(arguments).size() && Object.isString(arguments[0])) 
*             this.reportTarget.update('<span class="failure">'+arguments[0]+'</span>');
*         else 
*             this.reportTarget.update('<span class="failure">Echec de la connexion! Aucun utilisateur n\'est enregistré sous ces identifiants...</span>');
*     }
* };
*/
function ajaxFormSubmissionHandler(dom_event, requestHandlingModule){
    // requestHandlingModule : {reportTarget:element, url:string, params:function(){}, failure:function(){}, success:function(){}}
    Event.stop(dom_event);
    //suppression des éventuels message précédents
    $$('.error_element').each(function(elt){
        elt.removeClassName('error_element');
    });
    $$('span.error_msg').each(function(elt){
        elt.remove();
    });
    var callBack = function(xhr){
        if(xhr.responseText.isJSON()){           
            
			//var tmp_resp = $H(xhr.responseText.evalJSON());
			//var reportList = ('_object' in tmp_resp)? tmp_resp._object : tmp_resp;
			var reportList = $H(xhr.responseText.evalJSON());
            if(reportList.find(function(elt){return (elt[0] == "action_result")}) !== undefined){
				//alert(reportList.action_result);
				if(reportList._object.action_result){
                    requestHandlingModule.success(); 
                }else{
                    if (reportList._object.report) 
                        requestHandlingModule.failure(reportList._object.report);
                    else
                        requestHandlingModule.failure();
                }    
            }else{
                var summary = '';
                requestHandlingModule.reportTarget.update();
                reportList.each(function(pair){
                    var badOne = $(pair.key);
					badOne.addClassName('error_element');//.insert({after:'<span class="error_msg"> '+pair.value+'</span>'});
                    if(Prototype.Browser.IE){
	                	new Insertion.After(badOne, '<span class="error_msg"> '+pair.value+'</span>');
					}else{
	                	new Insertion.Before(badOne, '<span class="error_msg"> '+pair.value+'</span>');
						var inserted = badOne.previous();
						inserted.setStyle({
							position:'absolute', 
							top:badOne.offsetTop-13, 
							left:(badOne.tagName == "TEXTAREA")? badOne.offsetLeft : badOne.getStyle('left')
						});
					}					
					summary += '<p>'+pair.value+'</p>';
                });
            }                                           
        }else {
			requestHandlingModule.reportTarget.innerHTML = '<span class="failure">Réponse serveur mal formée!</span>';
		}
        return
    }//callBack
    var my_request = new Ajax.Request(requestHandlingModule.url, {parameters:requestHandlingModule.params(), onSuccess:callBack});
    return
}//ajaxFormSubmissionHandler


/************* Functions dream **************************************/
function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}
function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

/********************************* fonctions pour fixer google maps et suivi de recherche **************/
function getWindowHeight() {
			var windowHeight = 0;
			if (typeof(window.innerHeight) == 'number') {
				windowHeight = window.innerHeight;
			}
			else {
				if (document.documentElement && document.documentElement.clientHeight) {
					windowHeight = document.documentElement.clientHeight;
				}
				else {
					if (document.body && document.body.clientHeight) {
						windowHeight = document.body.clientHeight;
					}
				}
			}
			return windowHeight;
		}
		
		function getWindowWidth() {
			var windowHeight = 0;
			if (typeof(window.innerWidth) == 'number') {
				windowWidth = window.innerWidth;
			}
			else {
				if (document.documentElement && document.documentElement.clientWidth) {
					windowWidth = document.documentElement.clientWidth;
				}
				else {
					if (document.body && document.body.clientWidth) {
						windowWidth = document.body.clientWidth;
					}
				}
			}
			return windowWidth;
		}
		function setFooter() {
			if (document.getElementById) {
				var windowHeight = getWindowHeight();
				var windowWidth = getWindowWidth();
				if (windowHeight > 0) {
					var iebody=(document.compatMode && document.compatMode != "BackCompat")? document.documentElement : document.body
					var dsocleft=document.all? iebody.scrollLeft : pageXOffset
					var dsoctop=document.all? iebody.scrollTop : pageYOffset
					var contentHeight = document.getElementById('global').offsetHeight;
					var footerElement = document.getElementById('lesfixes');
					var footerHeight  = footerElement.offsetHeight;
					//if (windowHeight - (contentHeight + footerHeight) >= 0) {
					if (dsoctop >620) {
						footerElement.style.position = 'fixed';
						//footerElement.style.top = (windowHeight - (contentHeight + footerHeight)) + 'px';
						footerElement.style.top = '0px';
						if (document.all) footerElement.style.left = (windowWidth/2) + 505 + 'px';
						else footerElement.style.left = (windowWidth/2) + 496 + 'px';
					}
					else {
						footerElement.style.position = 'static';
					}
				}
			}
		}
