// Objet Date utilisé par les différentes fonctions
var Date_Calendar = new Date();
var WeekDay = new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
var DateSuffix = new Array('','st');
var Months = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
// 
// Fonctions AJAX
//

//Variable de l'objet de requête
var Request_Activities = null;

//Function creant l'objet de requête
function Create_Request_Activities() {

	try {
		Request_Activities = new XMLHttpRequest();
	} catch (trymicrosoft) {
		try {
			Request_Activities = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (othermicrosoft) {
			try {
				Request_Activities = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (failed) {
				Request_Activities = null;
			}
		}
	}
};

// Fonction qui va chercher les activites en Ajax
function Get_Activities(year,month) {
    //On load les activités seulement si on est pas déjà en train de le faire...
    if (!document.getElementById('Calendar_Wait_Message'))
    {
	    //Paramètre de date
        if (isNaN(year) || year < 1)
            year = 2012;
    	if (year != null) {
	    	Date_Calendar.setFullYear(year);
    	} else {
		    year = Date_Calendar.getFullYear();
	    };
    	if (month != null) {
	    	Date_Calendar.setMonth(month-1);
    	} else {
	    	month = Date_Calendar.getMonth()+1;
    	};
	    Date_Calendar.setDate(1);
    	Date_Calendar.setHours(0,0,0,0);
	
	    //Efface le calendrier actuel
    	Erase_Calendar();
	
	    //Affiche le message veuillez patienter
    	Show_Wait_Message();
	
	    //Cree l'objet requete s'il n'est pas déjà créé...
        
    	if (Request_Activities == null) 
	    	Create_Request_Activities();
    	//Si la création a réussie, on va chercher les données...
	    if (Request_Activities != null) {
    		//Va chercher les données...
		    var url = "/calendar_files/includes/get_month_activities.php?year="+escape(Date_Calendar.getFullYear())+"&month="+escape(Date_Calendar.getMonth()+1)+"&dummy="+new Date().getTime();
	    	Request_Activities.open("GET", url, true);
    		Request_Activities.onreadystatechange = Request_Activities_StateChange;
	    	Request_Activities.send(null);
    	} else {
	    	//Si l'objet request est null, on desinne tout de suite le calendrier
    		Draw_Calendar();
    	}
        return true;
    }
    return false;
};

//Fonction qui recoit les activités de la requête Ajax
function Request_Activities_StateChange() {
	// Une fois la requête complétée, on redesinne le calendrier
	if (Request_Activities.readyState==4) {		
		if (Request_Activities.status==200) {
			// Si la requête est revenue correctement, on traite les activités reçues
			Array_Month_Activities = eval('('+Request_Activities.responseText+')');
		} else {
			// Erreur
		};
		Draw_Calendar();
	};
};

//
// Fonctions de gestion des données du calendrier
//

//Objet contenant les activités du mois en cours
var Array_Month_Activities = null;

//Fonction qui retourne un array des activités d'une journée...

function Get_Day_Activities(ActivitiesDate) {	
	if (Array_Month_Activities != null) {
		var Array_Day_Activities = new Array();
		var i = 0;
		for(var i = 0;i < Array_Month_Activities.length;i++) {
			if (Array_Month_Activities[i].date == (ActivitiesDate.getFullYear()+"-"+((ActivitiesDate.getMonth()+1)<10?"0"+(ActivitiesDate.getMonth()+1):(ActivitiesDate.getMonth()+1))+"-"+((ActivitiesDate.getDate())<10?"0"+(ActivitiesDate.getDate()):(ActivitiesDate.getDate())))) {
				Array_Day_Activities.push(Array_Month_Activities[i]);
			};
		};
		return Array_Day_Activities;
	} else {
		return null;
	};
};

//
//Fonctions d'affichage generale
//

//Variables globales pour l'affichage du block
var Block_Scroll_Positions;


function Get_Window_Dimensions() {
	//Obtiens la largeur et hauteur interieur de la fenêtre selon le navigateur
	var Window_Width = 0, Window_Height = 0;
	if( typeof( window.innerWidth ) == 'number' ) { 
		//Non-IE
		Window_Width = window.innerWidth;
		Window_Height = window.innerHeight;
	} else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
		//IE 6+ in 'standards compliant mode'
		Window_Width = document.documentElement.clientWidth;
		Window_Height = document.documentElement.clientHeight;
	} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		//IE 4 compatible
		Window_Width = document.body.clientWidth;
		Window_Height = document.body.clientHeight;
	};
	return [Window_Width, Window_Height];
};

function Get_Scroll_Positions() {
	var scrOfX = 0, scrOfY = 0;
 	if( typeof( window.pageYOffset ) == 'number' ) {
    	//Netscape compliant
    	scrOfY = window.pageYOffset;
    	scrOfX = window.pageXOffset;
  	} else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    	//DOM compliant
    	scrOfY = document.body.scrollTop;
    	scrOfX = document.body.scrollLeft;
  	} else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    	//IE6 standards compliant mode
    	scrOfY = document.documentElement.scrollTop;
    	scrOfX = document.documentElement.scrollLeft;
  	}
  	return [ scrOfX, scrOfY ];
};

//
// Fonctions d'affichage du calendrier
// 

//Efface le calendrier (Les semaines du mois en cours)
function Erase_Calendar() {
	var i = 1;
	//Vide l'array des activites
	Array_Activities = null;
	while (Calendar_Week = document.getElementById("Calendar_Week"+i)) {
		Calendar_Week.parentNode.removeChild(Calendar_Week);
		i++;
	};
};

// Affiche le message "Veuillez patientez" dans le calendrier
function Show_Wait_Message() {
	//Désactive les menus déroulants pour éviter de lancer 2 requêtes en même temps
	Calendar_Select_Month = document.getElementById("Calendar_Select_Month");
	Calendar_Select_Month.disabled = true;
	Calendar_Select_Year = document.getElementById("Calendar_Select_Year");
	Calendar_Select_Year.disabled = true;
	//Cree le message
	WaitRow = CreateRow("Calendar_Wait_Message");
	WaitCell = CreateFillerCell(7);
	WaitText = document.createTextNode("Please wait...");
	WaitCell.appendChild(WaitText);
	WaitRow.appendChild(WaitCell);
	var Calendar_Footer = document.getElementById("Calendar_Footer");
	Calendar_Footer.parentNode.insertBefore(WaitRow,Calendar_Footer);
};

// Efface le message "Veuillez patientez"
function Erase_Wait_Message() {
	//Réactive les menus déroulants 
	Calendar_Select_Month = document.getElementById("Calendar_Select_Month");
	Calendar_Select_Month.disabled = false;
	Calendar_Select_Year = document.getElementById("Calendar_Select_Year");
	Calendar_Select_Year.disabled = false;
	CalendarWait = document.getElementById('Calendar_Wait_Message');
	if (CalendarWait != null) 
		CalendarWait.parentNode.removeChild(CalendarWait);
};


//Crée une rangée dans la table
function CreateRow(RowId) {
	CurrentRow = document.createElement("TR");
	CurrentRow.setAttribute("id",RowId);
	return CurrentRow;

};

//Crée des cellules "Filler" quand le mois ne commence pas un lundi ou ne finit pas un dimanche
function CreateFillerCell(ColSpan) {
	FillerCell = document.createElement("TD");
	FillerCell.setAttribute("colSpan",ColSpan);
	FillerCell.innerHTML = "&nbsp;";
	FillerCell.className = "Calendar_filler_cell";
	return FillerCell;
};

//Crée une cellule "Filler" sans colspan quand le mois ne commence pas un lundi ou ne finit pas un dimanche
function CreateFillerDayCell() {
	FillerCell = document.createElement("TD");
	FillerCell.innerHTML = "&nbsp;";
	FillerCell.className = "Calendar_filler_day";
	return FillerCell;
};

//Crée une la cellule pour une journée...

function CreateDayCell(CellDate) {
	var Array_Day_Activities = null;
	DayCell = document.createElement("TD");
	DayCell.setAttribute("id","Calendar_Day_"+(CellDate.getFullYear()+"-"+((CellDate.getMonth()+1)<10?"0"+(CellDate.getMonth()+1):(CellDate.getMonth()+1))+"-"+((CellDate.getDate())<10?"0"+(CellDate.getDate()):(CellDate.getDate()))));
	//Va chercher l'array des activités de cette journée...
	Array_Day_Activities = Get_Day_Activities(CellDate);
	if ((Array_Day_Activities != null) && (Array_Day_Activities.length>0)) {
		//Il y a des activités pour cette journée, ajoute un onclick
		DayCell.onclick=Show_Calendar_Date;
		DayCell.className = "Calendar_Day_With_Activities";
        if (Array_Day_Activities[0].classe_css != '')
            DayCell.className = DayCell.className + ' ' + Array_Day_Activities[0].classe_css;
	} else {
		DayCell.className = "Calendar_Day_No_Activities";
	};
	DayCellText = document.createTextNode(CellDate.getDate());
	DayCell.appendChild(DayCellText);
	return DayCell;
};

//Affiche le calendrier pour le mois de Date_Calendar
function Draw_Calendar() {
	//Mois actuel	
	month = Date_Calendar.getMonth();
	//Semaine actuel dans le mois
	var CurrentWeek = 1;

	//Efface le message veuillez patienter
	Erase_Wait_Message();
	
	//Affiche le calendrier

	//Obtient la table Calendrier
	var Calendar_Table = document.getElementById("Calendar_Table");
	//Obtient le bas du Calendrier
	var Calendar_Footer = document.getElementById("Calendar_Footer");

	//Filler pour début du mois
	BeginColSpan = Date_Calendar.getDay();
	if (BeginColSpan != 0) {
		//Cree le filler de début de mois
		CurrentWeekRow = CreateRow("Calendar_Week"+CurrentWeek);
        for (var i = 0; i < BeginColSpan; i++)
        {
	    	BeginFillerCell = CreateFillerDayCell();
    		CurrentWeekRow.appendChild(BeginFillerCell);
        }
	};
	while (Date_Calendar.getMonth() == (month)) {
		if (Date_Calendar.getDay() == 0) {
			//Commence une semaine
			CurrentWeekRow = CreateRow("Calendar_Week"+CurrentWeek);
		};
		DayCell = CreateDayCell(Date_Calendar);
		CurrentWeekRow.appendChild(DayCell);
		if (Date_Calendar.getDay() == 6) {
			//Fini la semaine
			Calendar_Footer.parentNode.insertBefore(CurrentWeekRow,Calendar_Footer);
			CurrentWeek++;
		};
		Date_Calendar.setDate(Date_Calendar.getDate()+1);
	};
	//Filler pour fin du mois
	EndColSpan = (7 - Date_Calendar.getDay())%7;
	if (EndColSpan > 0) {
        for (var i = 0; i < EndColSpan; i++)
        {
    		EndFillerCell = CreateFillerDayCell();
	    	CurrentWeekRow.appendChild(EndFillerCell);
        }
		Calendar_Footer.parentNode.insertBefore(CurrentWeekRow,Calendar_Footer);
	};

};

//Affiche les activités d'une journée quand on clique sur celle-ci
function Show_Calendar_Date() {
	//Trouve la date de l'element cliqué selon l'ID de celle-ci
	ElementDate = new Date();
	ElementDate.setFullYear(this.id.substring(this.id.length-10,this.id.length-6));
	ElementDate.setMonth(this.id.substring(this.id.length-5,this.id.length-3)-1);
	ElementDate.setDate(this.id.substring(this.id.length-2,this.id.length));
	//Obtient les activités de cette date
	Array_Day_Activities = Get_Day_Activities(ElementDate);
	if (Array_Day_Activities != null) {
		//Affiche le block contenant les détails sur la journée...
		//Obtient les données sur les scrolls et les sauvegarde pour réaffichage
		Block_Scroll_Positions = Get_Scroll_Positions();
		
		//Obtient les dimensions de la fenêtre
		Window_Dimensions = Get_Window_Dimensions();

		//Affiche le block avec les données de la date
		Date_Block = document.getElementById("Calendar_Date_Block");
		if (Date_Block != null) {
			//POUR NE PAS QUE LES SELECTS APPARAISSENT PAR-DESSUS LE THICKBOX
        	Date_Block.innerHTML = '<!--[if lte IE 6]><iframe class="popup-div-ie6"></iframe><![endif]-->';
			//Date_Block.onclick=Hide_Calendar_Date;
			//Entête FERMER du block
			Block_Close_Div = document.createElement("DIV");
			Block_Close_Div.setAttribute("id","Calendar_Date_Block_Close_Header");
			Block_Close_A_Fermer = document.createElement("A");
			Block_Close_A_Fermer.appendChild(document.createTextNode("Close X"));
			Block_Close_A_Fermer.onclick = Hide_Calendar_Date;
			Block_Close_Div.appendChild(Block_Close_A_Fermer);
			Date_Block.appendChild(Block_Close_Div);
			//Affiche chacune des activités du block
			for (var i = 0; Array_Day_Activities.length>i;i++) {
				//Div contenant les détails du titre et de la date activité...
                
				Activity_Div = document.createElement("DIV");
				Activity_Div.className = "Calendar_Date_Block_Activity";
			//Image activité...
			Block_Image_Div = document.createElement("DIV");
            Block_Image_Div.style.cssFloat = 'left';
            Block_Image_Div.style.styleFloat = 'left';
            Block_Image_Div.style.width = '204px';
            Block_Image_Div.style.height = '107px';
			Block_Image_Div.setAttribute("id","Calendar_Image_Block_" + i);
			Block_Image_Div.innerHTML = '<img src="' + Array_Day_Activities[i]['image_med'] + '" alt=""/>';
			Activity_Div.appendChild(Block_Image_Div);
                
				//Div pour le titre et la date de l'activité...
                
				Block_Activity_Div = document.createElement("DIV");
				Block_Activity_Div.className = "Calendar_Date_Block_Activity_Title";
				Block_Activity_Div.innerHTML = '<span class="BoldUpper">'+Array_Day_Activities[i].titre+'</span>'+'<br/ >'+WeekDay[ElementDate.getDay()]+', '+Months[ElementDate.getMonth()]+' '+ElementDate.getDate()+(DateSuffix[ElementDate.getDate()]!=null?DateSuffix[ElementDate.getDate()]:'')+' '+ElementDate.getFullYear();
				Activity_Div.appendChild(Block_Activity_Div);
                
                Retour = document.createElement('div');
                Retour.style.clear = 'both';
                Retour.appendChild(document.createTextNode(' '));
                Activity_Div.appendChild(Retour);
                
				//Ajoute l'activité au Block
				Date_Block.appendChild(Activity_Div);
				
				//Div contenant les détails de heure
				Activity_Div = document.createElement("DIV");
				Activity_Div.className = "Calendar_Hours_Block_Activity";
				//Div pour la date de début et de fin
				Block_Activity_Div_Time = document.createElement("DIV");
				Block_Activity_Div_Time.className = "Calendar_Date_Block_Activity_Time";
                
                var time_content = '';
                if (Array_Day_Activities[i].heure_debut == '00:00:00' && Array_Day_Activities[i].heure_fin == '00:00:00')
                    time_content = '&nbsp;';
                else
                    if (Array_Day_Activities[i].heure_debut == Array_Day_Activities[i].heure_fin || Array_Day_Activities[i].heure_fin == '00:00:00')
                        time_content = 'From ' + Array_Day_Activities[i].heure_debut;
                    else
                        if (Array_Day_Activities[i].heure_debut == '00:00:00')
                            time_content = 'Until ' + Array_Day_Activities[i].heure_fin;
                        else
                            time_content = '<span class="Bold">from:&nbsp;</span>' + Array_Day_Activities[i].heure_debut + '<span class="Bold">' + "&nbsp;&nbsp;&nbsp;to:&nbsp;" + '</span>' + Array_Day_Activities[i].heure_fin;

				Block_Activity_Div_Time.innerHTML = time_content;
				Activity_Div.appendChild(Block_Activity_Div_Time);		
				//Ajoute l'activité au Block
				Date_Block.appendChild(Activity_Div);
				
				//Div contenant les détails description
				Activity_Div = document.createElement("DIV");
				Activity_Div.className = "Calendar_Desc_Block_Activity";
				//Div pour la description
				Block_Activity_Div_Description = document.createElement("DIV");
				Block_Activity_Div_Description.className = "Calendar_Date_Block_Activity_Description";
				Block_Activity_Div_Description.innerHTML = Array_Day_Activities[i].description;
				Activity_Div.appendChild(Block_Activity_Div_Description);		
				//Ajoute l'activité au Block
				Date_Block.appendChild(Activity_Div);
				
			};
			//Affiche le block popup
			Date_Block.style.display = "block";
			
			//Centre le block dans la fenêtre
			//Left ((Largeur de fenêtre - Largeur du block) / 2) + Position de scroll gauche
			Date_Block.style.left = (Math.round((Window_Dimensions[0]-Date_Block.offsetWidth)/2)+Block_Scroll_Positions[0])+"px";
			//Top ((Hauteur de fenêtre - hauteur du block)/2) + Position du scroll top
			Date_Block.style.top = (Math.round((Window_Dimensions[1]-Date_Block.offsetHeight)/2)+Block_Scroll_Positions[1])+"px";
			
			//On définit l'élément body comme block
			document.body.style.display = 'block';
			
			//Affiche le block de Background		
			Block_Background = document.getElementById("Calendar_Block_Background");
			if (Block_Background != null) {
				//On affiche le fond du pop-up
				Block_Background.style.display = "block";
				Block_Background.style.top = "0px";
				Block_Background.style.left = "0px";
				Block_Background.style.width = Window_Dimensions[0]+"px";
				
				//Position, hauteur du pied
				var PosPied = document.getElementById('pied').offsetTop; 
				var HautPied = document.getElementById('pied').offsetHeight;
				
				//On définit la hauteur de fond du popup
				if( (PosPied + HautPied) > Window_Dimensions[1] ) {
					//Si le contenu de la page est plus grand que la fenetre
					Block_Background.style.height = PosPied + HautPied + 'px'; 
				} else {
					//Si le contenu de la page est plus petit que la fenetre
					Block_Background.style.height = Window_Dimensions[1] + 'px'; 
				}
			};			
		};
	};
	// Return false, pour ne pas que le navigateur ne suive le lien
	return false;
};

function Hide_Calendar_Date() {
	// Cache le block avec les données de la date
	Date_Block = document.getElementById("Calendar_Date_Block");
	if (Date_Block != null) {
		//Efface le contenu du block
		while (Date_Block.childNodes.length > 0) {
			Date_Block.removeChild(Date_Block.childNodes[0]);
		};
		//Cache le block
		Date_Block.style.display = "none";
		
	};
	//Cache le Block de background
	Block_Background = document.getElementById("Calendar_Block_Background");
	if (Block_Background != null) {
		Block_Background.style.display = "none";
	};
	
	//Rescroll à la bonne position dans la page
	window.scrollTo(Block_Scroll_Positions[0],Block_Scroll_Positions[1])
	
	//return false pour ne pas suivre les liens;
	return false;
};

function Update_UI(aYear, aMonth) {
    var monthContainer = document.getElementById('Calendar_Select_Month');
    var yearContainer = document.getElementById('Calendar_Select_Year');
    var monthContainerDisplay = document.getElementById('CalendrierMois');
    var yearContainerDisplay = document.getElementById('CalendrierAnnee');

    if (monthContainer)
        monthContainer.value = aMonth;
    if (yearContainer)
        yearContainer.value = aYear;

    if (monthContainerDisplay)
        monthContainerDisplay.innerHTML = Months[aMonth - 1].toUpperCase();
    if (yearContainerDisplay)
        yearContainerDisplay.innerHTML = aYear;
}

function Next_Month(currYear, currMonth) {
    if (isNaN(currYear) || currYear < 1)
        currYear = 2012;
    if (isNaN(currMonth) || currMonth < 1 || currMonth > 12)
        currYear = 2;

    if (currMonth > 11)
    {
        currMonth = 1;
        ++currYear;
    }
    else
        ++currMonth;
        
    if (Get_Activities(currYear, currMonth))
        Update_UI(currYear, currMonth);
}

function Prev_Month(currYear, currMonth) {
    if (isNaN(currYear) || currYear < 1)
        currYear = 2012;
    if (isNaN(currMonth) || currMonth < 1 || currMonth > 12)
        currYear = 2;

    if (currMonth > 1)
        --currMonth;
    else
    {
        currMonth = 12;
        --currYear;
    }
        
    if (Get_Activities(currYear, currMonth))
        Update_UI(currYear, currMonth);
}
