

/* ###############################################
* Verif d'un formulaire.
* tous les champs dont la classe = "require type_MonType"
* vont etre vérifiés où 
* MonType => (texte,email,date,select)
*
*/
var couleur_de_bordure="#636363";
function verification(forme)
{
	// recup de tous les input obligatoires
	var texte_erreur="Vous n'avez pas rempli tous les champs obligatoires...";
	var email_erreur="L'adresse email n'est pas valide...";
	var select_erreur="Choisissez une option dans la liste déroulante...";
	var date_erreur="La date n'est pas valide... format : jj/mm/aaaa";
	var int_erreur="Remplissez le champ avec un nombre entier...";
	var checkbox_erreur="Pour finaliser votre demande de réservation, Vous devez accepter les conditions générales de vente en cochant la case correspondante...";
	
	var dateFin_erreur="La date de fin doit être supérieure à la date de début..."
	
	var counts = getElementsByClass('require',forme,'*');
	var i, count, matches, countHolder;
	
	//print_r(counts);
	
	for (i=0; i<counts.length; i++)
	{
		count = counts[i];
		
		// recup du type d'input
		matches = count.className.match(/type_(.*)/)
		count.TheType = RegExp.$1;
		
		switch(count.TheType)
		{
			case'texte':
				if(count.value == '')
				{
					alert (texte_erreur);count.focus();colore(count.id);
					return false;
				}
				
				init(count.id);
				break;
				
			case'email':
				if(count.value == '')
				{
					alert (texte_erreur);count.focus();colore(count.id);
					return false;
				}
				
				if( !(verifMail(count.value)) )
				{
					alert (email_erreur);count.focus();colore(count.id);
					return false;				
				}
				
				init(count.id);	
				break;
				
			case'date':
				if(count.value == '')
				{
					alert (texte_erreur);count.focus();colore(count.id);
					return false;
				}
				
				if( !(verifDate(count.value)) )
				{
					alert (date_erreur);count.focus();colore(count.id);
					return false;				
				}
				
				init(count.id);	
				break;
				
			case'selectMultiple':
				if(count.value == '')
				{
					alert (texte_erreur);count.focus();colore(count.id);
					return false;
				}
				init(count.id);	
				break;
			case'select':	
				if (count.selectedIndex == 0)
				{
					alert (select_erreur);count.focus();colore(count.id);
					return false;
				}
				
				init(count.id);	
				break;
			case'checkbox':
				if(!count.checked)
				{
					alert (checkbox_erreur);count.focus();colore(count.id);
					return false;
				}
				init(count.id);	
				break;
			case'int':
				if(count.value == '')
				{
					alert (texte_erreur);count.focus();colore(count.id);
					return false;
				}
				
				if( (isNaN(count.value)) )
				{
					alert (int_erreur);count.focus();colore(count.id);
					return false;				
				}
				
				init(count.id);	
				break;
		}
		
		// Date Fin supérieure à une autre
		if(matches = count.className.match(/DateFin_(.*)/))
		{
			count.TheDateFin = RegExp.$1;
			if(count.value != '' && 
			   format_date($(count.TheDateFin).value,'mysql') > format_date(count.value,'mysql') )
			{
				alert (dateFin_erreur);count.focus();colore(count.id);
				return false;	
			}
		}
		
	}
	return true;
}

/* ###############################################
* Verif d'une @ email
*
*
*
*/
function verifMail(email) 
{ 
	// vérif validité email par REGEXP
   var reg = /^[a-z0-9._-]+@[a-z0-9.-]{2,}[.][a-z]{2,3}$/
   return (reg.exec(email)!=null)
}
function verifMail_old(mail)
{
  var sigle,mail,N;
  var valide=true;
  
  // si il y a un espace, ou si le champs est vide, non valide
  if (mail.lastIndexOf(' ')!=-1 || mail==''){return(false);}
  
  // s'il y a plus qu'un @ ou si @ n'existe pas dans la chaine
  if ((mail.indexOf('@')!=mail.lastIndexOf('@')) || mail.indexOf('@')==-1) {return(false)}
  
  chaine=mail.substring(mail.indexOf('@'),mail.lastIndexOf('.'));//la ss chaine entre @ et .
  
  //Un minimum de 2 caract entre @ et '.' et aussi minimum de 2 caract apres le dernier '.'
  if (chaine==false || (chaine.length<2)||((mail.substring(mail.lastIndexOf('.'))).length<2)){return(false)}
  
  // Mini 1 caract avant @
  if (mail.substring(0,mail.indexOf('@')).length<1){return(false)} 
  
  // pas de succession de point "...." avant l'@
  //MIEUX: if (mail.indexOf('..')!=-1){return false}
  chaine=mail.substring(0,mail.indexOf('@'));//ss chaine de 0 Ó l'@
  n=chaine.length;
  for (i=0;i<n;i++)
  {
    if (chaine.charAt(i)=='.' && chaine.charAt(i+1)=='.'){return(false)}
  }
  return(true);
}

function verifCP(cp)
{
  if (cp.length!=5)
  {return false;}  
  else {return true;}
}

/* ###############################################
* 
*
*/
function format_date(chaineDate,format)
{
	switch(format)
	{
		case'fr':
			if( matches = chaineDate.match(/([0-9]{4})[-|\/]([0-9]{2})[-|\/]([0-9]{2})/) )
			maDate=RegExp.$3+"/"+RegExp.$2+"/"+RegExp.$1;
			break;
		case'mysql':
			if( matches = chaineDate.match(/([0-9]{2})[-|\/]([0-9]{2})[-|\/]([0-9]{4})/) )
			maDate=RegExp.$3+"-"+RegExp.$2+"-"+RegExp.$1;
			break;
	}
	return maDate;
}

/* ###############################################
* 
*/
function verifDate(chaineDate)
{
   if (chaineDate == "") return false;
   //date formatée en JJ/MM/AAAA
   var ladate = (chaineDate).split("/")
   // ou formatée en JJ-MM-AAAA
   if(ladate.length != 3)ladate = (chaineDate).split("-")
   
   // Si je n'ai pas récupéré trois éléments ou bien s'il ne s'agit pas d'entiers, pas la peine non plus d'aller plus loin
   if ((ladate.length != 3) || isNaN(parseInt(ladate[0])) || isNaN(parseInt(ladate[1])) || isNaN(parseInt(ladate[2]))) 
   {
	   //date formatée MySQL
	   ladate = (chaineDate).split(" ");
	   ladate = (ladate[0]).split("-");
	   if ((ladate.length != 3) || isNaN(parseInt(ladate[0])) || isNaN(parseInt(ladate[1])) || isNaN(parseInt(ladate[2])))
	   {
		   //alert("Mauvais format de date : ecrire une date de la forme \"JJ/MM/AAAA\" ou \"AAAA-MM-JJ\"");
		   return false;
	   }
	   else {a=ladate[0];ladate[0]=ladate[2];ladate[2]=a}
   }

   // Sinon, c'est maintenant que je crée la date correspondante. Attention, les mois sont étalonnés de 0 à 11
   var unedate = new Date(eval(ladate[2]),eval(ladate[1])-1,eval(ladate[0]))

   var annee = unedate.getYear()
   if ((Math.abs(annee)+"").length < 4) annee = annee + 1900

   // Il ne reste plus qu'à vérifier si le jour, le mois et l'année obtenus sont les mêmes que ceux saisis par l'utilisateur.
   if (((unedate.getDate() == eval(ladate[0])) && (unedate.getMonth() == eval(ladate[1])-1) && (annee == eval(ladate[2]))) == false )
   {
	   //alert ("Votre date n'est pas valide!");
   	   return false;
   }
   return true;
}

/* ###############################################
* 
*
*/
function formatMysqlDate(chaineDate,champDate)
{
	var ladate = (chaineDate).split("/");
	champDate.value=ladate[2]+"/"+ladate[1]+"/"+ladate[0];
}

/* ###############################################
* Coloration du border d'un input
*
*
*
*/
function colore(id)
{
	with(document.getElementById(id).style) 
	{
      	borderColor="#ff0000";
    }
}
function init(id)
{
	with(document.getElementById(id).style) 
	{
      	borderColor=couleur_de_bordure;
    }
}

/*============================================================================
	Function de preload
	PREREQUIS:
	# le nb total d'images
	# la variable pause ( à "false")
	# le nom "timer" du timer
	# le cpt pour le num de l'image en cours
	# le tableau [liste_img] de la liste des chemins des images
	# le tableau [liste_alt] de la liste des alts des images
===========================================================================*/
var image=new Array();
function preload(liste_img)
{
	var nb_img=liste_img.length;
	
	for(i=0;i<nb_img;i++)
	{
		image[i]= new Image();
		image[i].src=liste_img[i];
	}
}

/*============================================================================
	Function de slide show
	PREREQUIS:
	# le nb total d'images
	# la variable pause ( à "false")
	# le nom "timer" du timer
	# le cpt pour le num de l'image en cours
	# le tableau [liste_img] de la liste des chemins des images
	# le tableau [liste_alt] de la liste des alts des images
===========================================================================*/
function roulement(image)
{
	// on met à jour les boutons play et pause
	maj_commandes();
	
	//alert(nb_max);
	//on change la photo
	TheDiv=document.getElementById(image);
	
	TheDiv.innerHTML="<img  class='photo' src='"+liste_img[cpt]+"' alt='"+liste_alt[cpt]+"' />";
	cpt++;
	if (cpt==nb_max)cpt=0;

	if(pause == false)timer=window.setTimeout("roulement('"+image+"')",4000);	
}

/*============================================================================
	Function pour les images des commandes
	PREREQUIS:
	# le nb total d'images
	# la variable pause 
	# les IDs des boutons play et pause
	# Les chemins des images ON et OFF
===========================================================================*/
function maj_commandes()
{
	ThePlay=document.getElementById('img_play');
	ThePause=document.getElementById('img_pause');
	if(pause == true)
	{
		//ThePause.src='images/diapo_pause_on.gif';
		//ThePlay.src='images/diapo_play_off.gif';
		ThePlay.style.display='';
		ThePause.style.display='none';
	}
	else
	{
		//ThePause.src='images/diapo_pause_off.gif';
		//ThePlay.src='images/diapo_play_on.gif';
		ThePlay.style.display='none';
		ThePause.style.display='';
	}
	//alert(ThePlay.src);
}

/*============================================================================
	Function qui ajoute une ligne d'input pour le formulaire de reservation
	PREREQUIS:
	
===========================================================================*/
var id_locataire=1000000;
function ajoute_locataire(block)
{
	TheBlock=$(block);
	//alert(TheBlock.innerHTML);
	
	TheChamp ='<div id="'+id_locataire+'">\n'
	TheChamp+='<input id="nom_'+id_locataire+'" type="text" class="input_locataire" name="mv_reservationsLocataires[nom_reservationsLocataires][]" value="" />';
	TheChamp+='<input id="prenom_'+id_locataire+'" type="text" class="input_locataire" name="mv_reservationsLocataires[prenom_reservationsLocataires][]" value="" />';
	TheChamp+='<input id="dateNaissance_'+id_locataire+'" type="text" class="input_locataire" name="mv_reservationsLocataires[dateNaissance_reservationsLocataires][]" value="" readonly="readonly" />';
	TheChamp+='<input id="parente_'+id_locataire+'" type="text" class="input_locataire" name="mv_reservationsLocataires[parente_reservationsLocataires][]" value="" />';
	TheChamp+='<img src="images/picto-moins.png" alt="Supprimer" title="Supprimer le champ" onclick="supprime_champ(\''+id_locataire+'\')" /><br class="clr" />';
	TheChamp+='</div>';
	
	//TheChamp+='<script type="text/javascript">Calendar.setup({"inputField":"debut_'+id_locataire+'","singleClick":false,"ifFormat":"%d/%m/%Y"});</script>';
	//TheChamp+='<script type="text/javascript">Calendar.setup({"inputField":"fin_'+id_locataire+'","singleClick":false,"ifFormat":"%d/%m/%Y"});</script>';
	//alert(TheChamp);
	
	
	//# recup des values
	values=new Array();
	recup_values(TheBlock);
	
	
	TheBlock.innerHTML+=TheChamp;
	
	// le innerHTML change => on reload le calendar
	for(i=0;i<size;i++)
	{
		// si c'est un fils de type balise
        if (TheBlock.childNodes[i].nodeType == 1)
        {
		TheSpan=TheBlock.childNodes[i];
		//alert(TheSpan.id);
		if(TheSpan.innerHTML != '')
		Calendar.setup({"inputField":"dateNaissance_"+TheSpan.id,"singleClick":false,"ifFormat":"%d/%m/%Y"});	
		}
	}
	
	//# on réinjecte les values
	reinjecte_values(TheBlock)
	
	// setup du calendrier
	Calendar.setup({"inputField":"dateNaissance_"+id_locataire,"singleClick":false,"ifFormat":"%d/%m/%Y"});
	
	id_locataire++;

	return false;
}
	/*#######################################*/
	// supprime un champ
	function supprime_champ(id_champ)
	{
		TheChamp=$(id_champ);
		TheChamp.innerHTML="";
		return false;
	}
	//############################
	//# fonction qui recupère toutes les
	//# values des petits fils de TheBlock
	//# 
	//# prérequis : le tab values
	function recup_values(TheBlock)
	{
		//# recup des values
		size=TheBlock.childNodes.length;
		for(i=0;i<size;i++)
		if (TheBlock.childNodes[i].nodeType == 1)
		{
			values[i]=new Array();
			for(j=0;j<TheBlock.childNodes[i].childNodes.length;j++)
			values[i][j]=TheBlock.childNodes[i].childNodes[j].value;
		}
	}
	
	//############################
	//# fonction qui réinjecte toutes les
	//# values des petits fils de TheBlock
	//# 
	//# prérequis : le tab values
	function reinjecte_values(TheBlock)
	{
		for(j=0;j<TheBlock.childNodes.length;j++)
		if (TheBlock.childNodes[j].nodeType == 1)
		{
			for(k=0;k<TheBlock.childNodes[j].childNodes.length;k++)
			if(values[j] && values[j][k])TheBlock.childNodes[j].childNodes[k].value=values[j][k];
		}
	}




/* ################# FONCTION POUR LES COINS ARRONDIS ############################# */
/**  http://www.sitepoint.com/article/rounded-corners-css-javascript
*   petit script qui crée 4 div imbriquées pour le prix d'une, 
*	chacune avec ça class, du coup il suffit de mettre un petit gif rond 
*	pour chacun de coins et le tour et joué.
*
*
*	** CSS **
*	.rounded, .corners_tr {#color};
*	.corners_tr {background: url(corner/tr.gif) no-repeat top right;}
*	.corners_bl {background: url(corner/bl.gif) no-repeat bottom left;}
*	.corners_tl {background: url(corner/tl.gif) no-repeat top left;}
*	.corners_br {background: url(corner/br.gif) no-repeat bottom right;}
*
*	** HTML **
*	<div class="rounded">content</div>
*
*
**/

function roundedCorners() 
{
	var divs = document.getElementsByTagName('div');
	var rounded = [];

	for (var i = 0; i < divs.length; i++) 
	{
		if (/\brounded\b/.exec(divs[i].className)){rounded[rounded.length] = divs[i];}
	}
	
	for (var i = 0; i < rounded.length; i++) 
	{
		var original = rounded[i];
		original.className = original.className.replace('rounded', 'corners_bl');
		
		var tr = document.createElement('div');
		tr.className = ' corners_tr';
		original.parentNode.replaceChild(tr, original);
		
		var tl = document.createElement('div');
		tl.className = 'corners_tl';
		
		var br = document.createElement('div');
		br.className = ' corners_br';
		
		tr.appendChild(tl);
		tl.appendChild(br);
		br.appendChild(original);
	}
}

/* ############################################################################ */
/* ############################################################################ */
/* ############################################################################ */
/* ############################################################################ */
/* ###############################################
* fonction équivalente de print_r de php
*
*
*
*/
function print_r(input)
{
	var ret;
	for(var i in input)
	{
		ret +="["+i+"] = "+input[i]+"\n";
	}
	alert(ret);
}

/* ###############################################
* possibilité d'appeller plusieurs id différents pour 
* obtenir un tableau d'éléments à parcourir ensuite : 
* var el = $('id1', 'id2', 'id3');. 
*
* fonction de Matthew Pennell : 
* http://www.thewatchmakerproject.com/journal/292/a-better-dollar-function-getelementsbyanything
*
*/
function $() {
	var elements = new Array();
	for (var i=0,len=arguments.length;i<len;i++) {
		var element = arguments[i];
		if (typeof element == 'string') {
			var matched = document.getElementById(element);
			if (matched) {
				elements.push(matched);
			} else {
				var allels = (document.all) ? document.all : document.getElementsByTagName('*');
				var regexp = new RegExp('(^| )'+element+'( |$)');
				for (var i=0,len=allels.length;i<len;i++) if (regexp.test(allels[i].className)) elements.push(allels[i]);
			}
			if (!elements.length) elements = document.getElementsByTagName(element);
			if (!elements.length) {
				elements = new Array();
				var allels = (document.all) ? document.all : document.getElementsByTagName('*');
				for (var i=0,len=allels.length;i<len;i++) if (allels[i].getAttribute(element)) elements.push(allels[i]);
			}
			if (!elements.length) {
				var allels = (document.all) ? document.all : document.getElementsByTagName('*');
				for (var i=0,len=allels.length;i<len;i++) if (allels[i].attributes) for (var j=0,lenn=allels[i].attributes.length;j<lenn;j++) if (allels[i].attributes[j].specified) if (allels[i].attributes[j].nodeValue == element) elements.push(allels[i]);
			}
		} else {
			elements.push(element);
		}
	}
	if (elements.length == 1) {
		return elements[0];
	} else {
		return elements;
	}
}


/* ###############################################
* recup d'element par le nom de sa classe
*
*
*
*/
function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

/* ###############################################
* Cette classe permet à l'objet "Array" (tableau), 
* de disposer de méthodes supplémentaires: suppression d'un élément, 
* ajout d'un élément, échange de deux éléments, extraction du dernier élément, 
* obtention du maximum, du minimum et de la valeur moyenne.
*/
//# on étends les méthodes du tableau..
ExtendArray();
function ExtendArray() {
 Array.prototype.remove = Array_Remove;
 Array.prototype.add = Array_Add;
 Array.prototype.swap = Array_Swap;
 // removes and returns last element
 Array.prototype.pop = Array_Pop;
 // use these with arrays of ints
 Array.prototype.min = Array_GetMin;
 Array.prototype.max = Array_GetMax;
 Array.prototype.avg = Array_GetAvg;
}


 function Array_Remove(c) {
  var tmparr = new Array();
  for (var i=0; i<this.length; i++) if (i!=c) tmparr[tmparr.length] = this[i];
   return tmparr;
 }

 function Array_Add(c, cont) {
  var tmparr = new Array();
  for (var i=0; i<this.length; i++) {
   if (i==c) tmparr[tmparr.length] = cont;
    tmparr[tmparr.length] = this[i];
  }
  if (!tmparr[c]) tmparr[c] = cont;
   return tmparr;
 }

 function Array_Swap(x, z) {
  var zvalue = this[z];
  this[z] = this[x];
  this[x] = zvalue;
  return this;
 }

 function Array_Pop() {
  var item = this[this.length-1];
  this.length--;
  return item;
 }

 function Array_GetMin() {
  var Min = this[0];
  if (isNaN(Min*1) && !IsDate(Min)) return '';
  for (var i=0; i<this.length; i++) if (this[i]*1<Min) Min = this[i];
  return Min;
 }

 function Array_GetAvg() {
  var Total = 0;
  if (isNaN(this[0]*1) && !IsDate(this[0])) return '';
  for (var i=0; i<this.length; i++) if (this[i] != 0) Total += this[i]*1;
  var Avg = Total/(Comps.length+1)
  if ((Avg+"").indexOf(".") > -1) { 
   if (GetMax(i)-GetMin(i) > 50)
    Avg = Math.round(Avg);
    // if difference between min and max > 50, round
    else Avg = (Avg+"").substring(0,(Avg+"").indexOf(".")+((bFloat) ? 3 : 2));
    // else if all values were whole round to 2 places, else 3
   }
  return (Avg>0) ? Avg : "";
 }

 function Array_GetMax() {
  var Max = this[0];
  if (isNaN(Max*1) && !IsDate(Max)) return '';
  for (var i=0; i<this.length; i++) if (this[i]*1>Max) Max = this[i];
  return Max;
 }
