//#14.00Aa WDCalendrier.JS
//VersionVI: 30F140025v
// Le seul support technique disponible pour cette librairie est
// accessible a travers le service "Assistance Directe".

// Manipulation d'un champ calendrier
function WDCalendrier (sAliasChamp)
{
	// L'alias du champ et de l'eventuel champ de saisie associe
	this.m_sAliasChamp = sAliasChamp;
}

WDCalendrier.prototype =
{
//	m_sAliasChamp:			"",
//	m_sAliasChampSaisie:	"",
//	m_oChamp:				null,
//	m_oChampValeur:			null,
//	m_oChampMois:			null,
//	m_oChampSaisie:			null,
//	m_fPCodeSelectionJour:	null,
//	m_fPCodeAffichageMois:	null,
//	m_clObjetSaisie:		null,
//	m_nTimeoutFocus:		null,
	sSuffixeJour:			"_JOUR",
	sSuffixeMois:			"_MOIS",
	sActionPrecedent:		"CALENDRIERPREC",
	sActionSuivant:			"CALENDRIERSUIV",
	sActionAujourdhui:		"CALENDRIERAUJO",

	// Initialisation :
	// - clObjetSaisie : Objet de manipulation de l'eventuel champ de saisie associe au champ
	Init:function (clObjetSaisie)
	{
		// Sauve le champ de saisie associe
		if (clObjetSaisie)
		{
			this.m_clObjetSaisie = clObjetSaisie;
			this.m_oChamp = _JGE(this.m_sAliasChamp, document, true, true);

			// Et cree l'objet popup automatique
			this.m_oPopupAutomatique = new WDPopupAutomatique(this.m_oChamp, this);
		}

		// Recupere les champs
		this.LiaisonElementsHTML();
	},

	// Evenement avant l'affectation en AJAX du contenu du calendrier
	PreAffecteHTML:function (bDepuisAJAX)
	{
		this.m_oChampValeur = null;
		this.m_oChampMois = null;

		// Si la popup existe (la classe gere en interne le cas de la popup affichee)
		if (this.m_oPopupAutomatique)
		{
			this.m_oPopupAutomatique.PreAffecteHTML(bDepuisAJAX);
		}
	},

	// Evenement apres l'affectation en AJAX du contenu du calendrier
	PostAffecteHTML:function (bDepuisAJAX)
	{
		// Si la popup existe
		if (this.m_oPopupAutomatique)
		{
			this.m_oPopupAutomatique.PostAffecteHTML(bDepuisAJAX);
		}

		// Recupere les champs contenant les valeurs
		this.LiaisonElementsHTML(bDepuisAJAX);
	},

	// Actions requises par le changement du HTML du champ
	LiaisonElementsHTML:function (bDepuisAJAX)
	{
		// Liaison avec les champs formulaire
		this.m_oChampValeur = document.getElementsByName(this.m_sAliasChamp + this.sSuffixeJour)[0];
		this.m_oChampMois = document.getElementsByName(this.m_sAliasChamp + this.sSuffixeMois)[0];
	},

	// Definition du PCode de selection de jour navigateur
	CodeSelectionJour:function (pFonctionSelection)
	{
		this.m_fPCodeSelectionJour = pFonctionSelection;
	},

	// Definition du PCode d'affichage de mois navigateur
	CodeAffichageMois:function (pFonctionAffichage)
	{
		this.m_fPCodeAffichageMois = pFonctionAffichage;
	},

	// Selection du jour depuis un clic dans la cellule mais AUTOUR du lien
	OnJourClick:function (oEvent, sDate, sActionMoteur)
	{
		// Filtre les clics qui sont sur la zone du lien
		var oSource;
		if (bIE)
		{
			oSource = oEvent.srcElement;
		}
		else
		{
			oSource = oEvent.explicitOriginalTarget;
		}
		if (oSource && ((oSource.tagName + "").toUpperCase() == "TD"))
		{
			return this.OnJour(oEvent, sDate, sActionMoteur);
		}
	},

	// Selection du jour
	OnJour:function (oEvent, sDate, sActionMoteur)
	{
		// Sauve l'ancienne valeur
		var sOldDate = this.m_oChampValeur.value;

		// Ecrit la date dans la valeur du champ
		this.m_oChampValeur.value = sDate;
		// Appel le PCode de selection s'il existe
		var bRes = this.m_fPCodeSelectionJour(oEvent, sActionMoteur);
		if (bRes !== false)
		{
			// Valide la valeur dans le champ de saisie si on en a un
			if (this.m_oPopupAutomatique)
			{
				// Transmet la valeur et les indications au champ de saisie
				this.m_clObjetSaisie.OnChangeCalendrier(oEvent, this.m_oChampValeur.value, this.m_oChampSaisie);

				// Et se masque
				this.m_oPopupAutomatique.Masque(undefined, false);
			}

			// Pas de return XXX : casse les HREFs
//			return bRes;
			return;
		}
		// Restaure l'ancienne valeur en cas d'annulation
		this.m_oChampValeur.value = sOldDate;
	},

	OnAujourdhui:function ()
	{
		// Pas de return XXX : casse les HREFs
		// Calcule la date du jour avec DateSys
//		return this.OnJour(undefined, _DS(), this.sActionAujourdhui);
		this.OnJour(undefined, _DS(), this.sActionAujourdhui);
	},

	// Change le mois courant
	OnChangeMois:function (nOffset, sActionMoteur)
	{
		// Sauve l'ancienne valeur
		var sOldDate = this.m_oChampMois.value;
		// Conversion de la date en chaine en objet Date
		var oMois = _WMD(sOldDate);

		// Modifie le mois
		var nMois = oMois.getMonth();
		nMois += nOffset;

		// Normalise le mois
		var nOffsetAnnee = 0;
		while (nMois < 0)
		{
			nOffsetAnnee--;
			nMois += 12;
		}
		while (nMois > 11)
		{
			nOffsetAnnee++;
			nMois -= 12;
		}

		// Defini le mois et forcant le debut du mois
		oMois.setMonth(nMois, 1);
		// Force l'annee si besoin
		if (nOffsetAnnee != 0)
		{
			oMois.setYear(oMois.getYear() + nOffsetAnnee);
		}

		// Convertit la valeur en chaine WL ecrite dans le champ cache
		this.m_oChampMois.value = _JDTW(oMois);
		// Appel le PCode de selection s'il existe
		var bRes = this.m_fPCodeAffichageMois(undefined, sActionMoteur);
		if (bRes !== false)
		{
			// Pas de return XXX : casse les HREFs
//			return bRes;
			return;
		}
		// Restaure l'ancienne valeur en cas d'annulation
		this.m_oChampMois.value = sOldDate;
	},

	OnNext:function ()
	{
		// Demande le mois precedent
		// Pas de return XXX : casse les HREFs
//		return this.OnChangeMois(+1, this.sActionSuivant);
		this.OnChangeMois(+1, this.sActionSuivant);
	},

	OnPrev:function ()
	{
		// Demande le mois suivant
		// Pas de return XXX : casse les HREFs
//		return this.OnChangeMois(-1, this.sActionPrecedent);
		this.OnChangeMois(-1, this.sActionPrecedent);
	},

	// Gestion du champ calendrier dans un champ de saisie

	// Notification (par le champ de saisie) que son contenu a changer
	OnChangeSaisie:function (oEvent, sValeur, oChampSaisie)
	{
		if (!this.m_oChampSaisie || (this.m_oChampSaisie != oChampSaisie))
		{
			this.m_oChampSaisie = oChampSaisie;
		}

		// Appele la methode interne avec la valeur
		this.OnJour(oEvent, sValeur);
	},

	// Notification de que champ doit etre affiche
	// Le champ aussi que le format d'affichage sont transmit pour memorisation
	Affiche:function (oEvent, oChampSaisie)
	{
		this.m_oPopupAutomatique.Affiche(oEvent, oChampSaisie);
	},

	// Notification de que champ doit etre affiche
	// Le champ aussi que le format d'affichage sont transmit pour memorisation
	AfficheInterne:function (oEvent, oChampSaisie)
	{
		// Memorise le champ precis (pour les ZR) sur lequel on est
		this.m_oChampSaisie = oChampSaisie;

		var oCibleAlign = oChampSaisie;
		// Deplace le champ selon la position du champ qui a recu le clic
		// Le champ calendrier popup est place pour que le bord droit soit aligne avec le bord droit du bouton
		// - Trouve le bouton source
		if (!oCibleAlign)
		{
			oCibleAlign = bIE ? oEvent.srcElement : oEvent.target;
		}

		// Decale le champ
		var nGauche = _JCCP(oCibleAlign.offsetLeft, oCibleAlign, true, true) + oCibleAlign.offsetWidth - parseInt(this.m_oChamp.style.width);
		if (nGauche < 0)
		{
			nGauche = 0;
		}
		SetStyleLeft(this.m_oChamp.style, _JCCP(nGauche,this.m_oChamp,true,false), 0);
		this.m_oChamp.style.top = _JCCP(_JCCP(oCibleAlign.offsetTop,oCibleAlign,false,true),this.m_oChamp,false,false) + oCibleAlign.offsetHeight;
	},

	// Notification de que champ doit etre masquer
	MasqueInterne:function (oEvent, bLostFocus)
	{
		// Si on a perdu le focus, il faut forcer le redessin du champ
		if (bLostFocus && this.m_oChampSaisie)
		{
			this.m_clObjetSaisie.OnChange(oEvent, this.m_oChampSaisie);
		}

		// Detruit les valeur memorisee sur le champ de saisie
		delete this.m_oChampSaisie;
	}
}

