var today = new Date();
var iWDay = today.getDay();
var iMDay = today.getDate();
var iYDay = today.getDate();
var iMonth = today.getMonth()+1;
var iYear = today.getFullYear();
var tMDays = new Array(31,28,31,30,31,30,31,31,30,31,30,31); // nb de jours d'un mois, celui de février est 29 si iYear bissextile
var tRien = new Array(undefined, null,"");
var toInitForms = new Array () ; // Tableau d'objets qui contiendra les valeurs initiales des éléments de formulaires

// Objet qui retourne les valuers initiales de tous les éléments de tous les formulaires
function oInitialValue (_zId)
{
	this.id = _zId ;
	this.length ;
}

// Recherche l'objet contenant les valeurs initiales d'un formulaire dans le tableau d'objets
function findFormIntial (_zId)
{
	for (iC0 = 0 ; iC0 < toInitForms.length ; iC0 ++)
	{
		if (toInitForms[iC0].id == _zId)
		{
			return toInitForms[iC0] ;
		}
	}
	return -1 ;
}

/**   Remplace des caracteres dans une chaine
 * @param   string   _zNeedle    chaine de caracteres a remplacer
 * @param   string   _zRepl    chaine de caracteres de remplacement
 * @param   string   _bStuck    Détermine si remplacement par caractère (false) ou par chaîne
 * @return  string   zRet        chaine de caractere obtenu
 **/
String.prototype.multiReplace = function(_zNeedle, _zRepl, _bStuck){
		var ret = "";
		if (_zNeedle!=undefined && _zNeedle!=null)  {
			if (_zRepl==undefined || _zRepl==null) {
				_zRepl = "";
			}
			if (_bStuck!=undefined && _bStuck!=null && _bStuck) { //remplacer les occurrences de _zNeedle
				ret = this.split(_zNeedle);
				ret = ret.join(_zRepl);
			} else { //remplacer les occurrences de chaque caractère de _zNeedle
				for (b=0; b<this.length; b++) {
			   	if ((c = _zNeedle.indexOf(this.charAt(b)))!=-1) {
						if (c<_zRepl.length) {
							ret += _zRepl.charAt(c);
						} else {
							if (_zRepl.length>0) {
								ret += _zRepl.charAt(_zRepl.length-1);
							} else {
								if (_zRepl!='') {
									ret += this.charAt(b);
								}
							}
						}
					} else {
						ret += this.charAt(b);
					}
			   }
			}
		}
// 		alert(this + "\n" + ret);
		return ret;
	};
// end method multiReplace()

/**
* Fonction de formatage de date FR en date EN (format mysql)
*
* @param 	String 	_zDatefr Date FR
* @return	String	zDatesql Date UK (ou NULL)
*/
function toDateSQL(_zDateFr) {
// 	alert(_zDateFr);
	zDateFr = _zDateFr.multiReplace(" ");
	tDate = zDateFr.split('/');
// 	alert(tDate);
	if (tDate[0]!="") {
		return tDate[2] + "-" + tDate[1] + "-" + tDate[0];
	}
	return zDateFr;
}

/**   Transforme en une chaîne date au format spécifié les données
 *
 **/
function dateFormat(_iYear, _iMonth, _iDate, _zFormat)
{
	if (_zFormat==undefined || _zFormat==null || _zFormat=="") {
	   _zFormat = "d/m/Y";
	}
	if (_iYear==undefined || _iYear==null || _iYear=="") {
	   _iYear = iYear;
	}
	if (_iYear%4==0) {
		tMDays[1] = 29;
	}

	if (_iMonth==undefined || _iMonth==null || _iMonth=="" || _iMonth<0 || _iMonth>11) {
		_iMonth = iMonth;
	}
	if (_iDate==undefined || _iDate==null || _iDate=="" || _iDate<1 || _iDate>tMDays[_iMonth]) {
	   _iDate = iMDay;
	}

//	_iYear = parseInt (_iYear) ;
	_iMonth = parseInt (_iMonth) ;
	_iDate = parseInt (_iDate) ;

	zYear = ""+_iYear;
	zMonth = (_iMonth<10) ? "0"+_iMonth :_iMonth;
	zDate = (_iDate<10) ? "0"+_iDate :_iDate;

	switch (_zFormat) {
	   case "d/m/Y":
	      return zDate+"/"+zMonth+"/"+zYear;
	      break;
	   case "m/d/Y":
	      return zMonth+"/"+zDate+"/"+zYear;
	      break;
	   case "Y-m-d":
	      return zYear + "-" + zMonth + "-" + zDate ;
	      break;
		default :
		   alert("format inconnu");
		   return;
		   break;
	}
}

/**   Affiche le message donné en paramètre
 *  nécessite jQuery
 * @param   String      _zMessage       Le message à afficher
 * @param   String      _bConcat       Concaténer (true) ou remplacer (false) le contenu de l'afficheur
 * @param   Object      _oCaller        L'objet appellant la fonction
 **/
function displayMessage (_zMessage, _bConcat)
{
	if (_bConcat != undefined && _bConcat != null && _bConcat == true)
	{
		_zMessage = $("#errorMessage").html () + _zMessage ;
	}
	$("#errorMessage").html (_zMessage.replace (/\n/, "\n<br>")) ;
	$("#errorMessage").show () ;
}

/**   Cache le conteneur de message
 *  nécessite jQuery
 **/
function hideMessage (_iType, _zMsg)
{
	_iType = (_iType != 'normal' && _iType != 'fast' && _iType != 'slow') ? '' : _iType ;
	_zMsg = (_zMsg == null || _zMsg == undefined) ? '' : _zMsg ;

	$("#errorMessage").html () ;
	$("#errorMessage").hide () ;
}

/**   Cache le conteneur de message
 *  nécessite jQuery
 **/
function removeMessage ()
{
	if ($("#errorMsg").length == 1)
	{
		$("#errorMsg").remove () ;
	}
}

// Enregistre les données initiales de tous les formulaires
registerInitialForms = function ()
{
	for (iC0 = 0 ; iC0 < $("form").length ; iC0 ++)
	{
		// Détermination de l'identifient
		if ($("form")[iC0].getAttribute ("id")!=undefined)
		{
			zId = $("form")[iC0].getAttribute ("id") ;
		}
		else if ($("form")[iC0].getAttribute ("name") != undefined)
		{
			zId = $("form")[iC0].getAttribute ("name") ;
		}
		// Si pas d'identifient ni de nom, attribuer un identifient
		else
		{
			zId = "form_" + iC0 ;
		}
		toInitForms[iC0] = new oInitialValue (zId) ;
		toInitForms[iC0].values = new Array () ;

		for  (iC1 = 0 ; iC1 < $("form")[iC0].length ; iC1 ++)
		{
			// Collecte des valeurs
			var elt = $("form")[iC0].elements[iC1] ;
			switch (elt.tagName)
			{
				case 'SELECT':
					toInitForms[iC0].values.push (elt.selectedIndex) ;
				break ;
				default :
					switch (elt.type)
					{
						case 'text' || 'password' || 'hidden' || 'textarea' :
							toInitForms[iC0].values.push (elt.value) ;
						break ;
						case 'checkbox' || 'radio' :
							toInitForms[iC0].values.push (elt.checked) ;
						break ;
						default :
						break ;
					}
				break ;
			}
		}
	}
}

/**
*	réinitialise les données d'un formulaire
*/
function raz (_oForm)
{
	_oForm.reset () ;
}

/**
*	Enlève les tags html
*/
function stripHtmlTags (_zStr)
{
	return _zStr.replace (/<[\w\W]*>/, "-*-") ;
}


/**
*	Valide le formulaire dont l'id est donné en paramètre
*/
function validerFormulaire (_zFormId)
{
	oForm = $('#' + _zFormId)[0] ;
	if (oForm == null || oForm == undefined)
	{
		alert ("Aucun formulaire à valider") ;
		return false ;
	}
	oForm.tmt_validator = new tmt_formValidator (oForm) ;
	return tmt_validateForm(oForm) ;
}


/**
*	Valide les données de l'éditeur FCK dont le nom d'instance est donné en paramètre
*/
function validEditor (_zInstanceName, _zErrorMsg)
{
	if ($("#" + _zInstanceName)[0].type == 'textarea')
	{
		dd = $("#" + _zInstanceName)[0] ;
		zContenu = dd.val () ;
	}
	else
	{
		if (navigator.appName.indexOf ("Internet Explorer") != -1)
		{
			dd = $("#" + _zInstanceName + "___Frame")[0] ;
			zContenu = dd.document.frames[0]['eEditorArea'].document.body.innerHTML ;
		}
		else
		{
			dd = $("#" + _zInstanceName + "___Frame")[0].contentDocument.getElementById('eEditorArea') ;
			zContenu = dd.contentDocument.body.innerHTML ;
		}
	}
	zUContenu = zContenu.toLowerCase() ;
	if (zUContenu == '' || zUContenu == '<br>' || zUContenu =='<p>&nbsp;</p>')
	{
		displayMessage (_zErrorMsg + "") ;
		dd.style.border = "dashed red 1px" ;
		dd.focus () ;
		return false ;
	}
	hideMessage () ;
	dd.style.border = "" ;
	return true ;
}

/**
*	Retourne à la page se trouvant dans le champ dont l'id est donné en paramètre
*/
function retourListe (_zBtnValue, _zUrlFieldId)
{
	zRep = confirm ("Vous venez de cliquer sur le bouton '" + _zBtnValue + "', toutes les modifications vont être perdues\n Etes-vous sûr de vouloir annuler ?") ;
	if (zRep == true)
	{
		document.location.replace ($('#' + _zUrlFieldId).val()) ;
	}
}

/**
*	Teste si la valeur (ou index) sélectionné d'un select-box est valid ou non
	En paramètre l'objet DOM HTML select à tester
*/
function validerSelect (oSelect)
{
	//	Validation par index invalides
	if (oSelect.getAttribute ("tmt:invalidindex") != undefined)
	{
		tiInvalidIndexes = oSelect.getAttribute ("tmt:invalidindex").split (',') ;
		for (iIndex in tiInvalidIndexes)
		{
			if (iIndex == oSelect.selectedIndex)
			{
				displayMessage (oSelect.getAttribute ("tmt:message")) ;
				return false ;
			}
		}
	}

	//	Validation par index valides
	if (oSelect.getAttribute ("tmt:validindex") != undefined)
	{
		tiValidIndexes = oSelect.getAttribute ("tmt:invalidindex").split (',') ;
		for (iIndex in tiValidIndexes)
		{
			if (iIndex != oSelect.selectedIndex)
			{
				displayMessage (oSelect.getAttribute ("tmt:message")) ;
				return false ;
			}
		}
	}

	//	Validation par valeurs invalides
	if (oSelect.getAttribute ("tmt:invalidvalue") != undefined)
	{
		tzInvalidValues = oSelect.getAttribute ("tmt:invalidvalue").split (',') ;
		for (zValue in tzInvalidValues)
		{
			if (zValue == oSelect.value)
			{
				displayMessage (oSelect.getAttribute ("tmt:message")) ;
				return false ;
			}
		}
	}

	//	Validation par valeurs valides
	if (oSelect.getAttribute ("tmt:validvalue") != undefined)
	{
		tzValidValues = oSelect.getAttribute ("tmt:validvalue").split (',') ;
		for (zValue in tzValidValues)
		{
			if (zValue != oSelect.value)
			{
				displayMessage (oSelect.getAttribute ("tmt:message")) ;
				return false ;
			}
		}
	}
	return true ;
}

/**
*	Valide un Select box : affiche un message d'erreur et focus si non valide, sinon cache le message d'erreur et retourne true
*/
function validationSelect (_zSelectId)
{
	if (!validerSelect ($("#" + _zSelectId)[0]))
	{
		displayMessage ($("#" + _zSelectId).attr ("tmt:message")) ;
		$("#" + _zSelectId).css ("border-color", "#FF0000") ;
		$("#" + _zSelectId).focus () ;
		return false ;
	}
	hideMessage () ;
	$("#" + _zSelectId).css ("border-color", "") ;
	return true ;
}

/**
*	Affiche les propriétés d'un objet

* @param	Object	_oObj	L'objet dont on veut afficher les propriétés
* @param	Integer	_iRank	Rang de l'objet
*/
function displayProperties (_oObj, _iRank)
{
	if (_iRank == undefined || _iRank == null)
	{
		_iRank = 0 ;
	}
	msg = "[" + _iRank + "] <br>" ;
	for (p in _oObj)
	{
		msg += "<br>- " + p + " -----> " + _oObj[p] ;
	}

	oDivCtn = document.createElement ("div") ;
	zCloseBtn = "<input type=\"button\" onclick=\"$(this).parent ('#divProp').hide ('slow') ;\" onmouseover=\"this.style.color = '#FF6600' ;\" onmouseout=\"this.style.color = '#FF0000' ;\" value=\"X\" style=\"color:#FF0000; font-weight:bold; border:1px solid #FF0000; \" />" ;
	$(oDivContainer).attr ("id", "divProp") ;
	$(oDivContainer).attr ("style", "position:absolute; background:#FFEEDD; border:red; left:100px; top: 250px; ") ;
	$(oDivContainer).html (msg) ;
}

function showHide (_zBoxId, _zTitleId)
{
	if ($("#" + _zBoxId).css ("display") == "none")
	{
		zIndicator = "[CACHER]" ;
		$("#" + _zBoxId).show ("normal") ;
	}
	else
	{
		zIndicator = "[AFFICHER]" ;
		$("#" + _zBoxId).hide ("normal") ;
	}
	if (!isGiven (_zTitleId))
	{
		return ;
	}
	if (_zTitleId.substr (0, 3) == 'btn')
	{
		$("#" + _zTitleId).val (zIndicator) ;
	}
	else
	{
		$("#" + _zTitleId).html (zIndicator) ;
	}
}

//	Attente : timer
var giTimerId = null ; // identifient du timer
var grTimerTimeOut = 60 ; // délai du timer
var grTimerStep = 0.25 ; // nombre de secondes de pas
var grTimerLevel = 0 ; // délai écoulé du timer
var gbTimerStop = false ; // condition veto pour stopper le timer

function wait (_iStep, _iOut, _zCallback)
{
	if (_iStep != undefined && _iStep != null)
	{
		grTimerStep = _iStep ;
	}
	if (_iOut != undefined && _iOut != null)
	{
		grTimerTimeOut = _iOut;
	}
	if (_zCallback == undefined || _zCallback == null)
	{
		_zCallback = "doNothing ()" ;
	}
	iTimerId = setTimeout (_zCallback, _iStep) ;
}

//	Ne fait rien (utilisé pour l'attente)
function doNothing ()
{
	if (gbTimerStop || grTimerLevel == grTimerTimeOut)
	{
		clearTimeout (giTimerId) ;
	}
	else
	{
		grTimerLevel += grTimerStep ;
	}
	return ;
}

//	Enregistre la date au format YYYY-MM-DD dans le champ de date caché
function setDateSql (_zFieldId, _zGroupName)
{
	_zGroupName = (!isGiven (_zGroupName)) ? 'article' : _zGroupName ;
	var tDate = $("#" + _zFieldId).val ().split ('/') ;
	if (tDate.length == 3)
	{
		//zD = dateFormat (tDate[2], tDate[1], tDate[0], "Y-m-d") ;
		zD = tDate[2] + "-" + tDate[1] + "-" + tDate[0] ;
		$("#" + _zGroupName + "_" + _zFieldId).val (zD) ;
	}
}

//	Charge le contenu d'un objet
function loadContent (_iContainerId, _oParams, _zCallback, _zMsgAttente)
{
	if (!isGiven (_iContainerId) || !isGiven ($("#" + _iContainerId)) || !isGiven ($("#" + _iContainerId).attr ('src')))
	{
		alert ("Conteneur ou source indéfini(e)") ;
		return false ;
	}
	_oParams = (!isGiven (_oParams)) ? {} : _oParams ;
	_zMsgAttente = (isGiven (_zMsgAttente)) ? _zMsgAttente : "Chargement en cours : Veuillez patienter!" ;
	displayMessage (_zMsgAttente) ;
	$("#" + _iContainerId).load ($("#" + _iContainerId).attr ('src'), _oParams, function(){
		if (isGiven (_zCallback))
		{
			eval (_zCallback) ;
		}
	}) ;
}

//	Détermine si une variable existe ou non
function isGiven (_oVar)
{
	return (_oVar != null && _oVar != undefined) ;
}

//	Affiche les propriétés d'un objet dans une fenêtre popup
function displayProp (oBj)
{
	oNewWindow = window.open( "", "properties") ;
	msg = "-----------------------********************--------------------" ;
	for (p in oBj)
	{
		msg += "\n<br>- " + p + "  ---> " + oBj[p] ;
	}
	oNewWindow.document.write (msg) ;
}