function select(startDate, endDate, allDay, jsEvent, view) {
	var event = {
		start : startDate,
		end : endDate,
		allDay : false
	};
	$j('#calendar').fullCalendar('renderEvent', event, true);
}

/* DIALOG */
function alternateNewEventStartHalfHour(event) {
	var newEvent_startHalfHour = document
			.getElementById('newEvent_startHalfHour');
	if (newEvent_startHalfHour.innerHTML == "00") {
		newEvent_startHalfHour.innerHTML = "15";
	} else if (newEvent_startHalfHour.innerHTML == "15") {
		newEvent_startHalfHour.innerHTML = "30";
	} else if (newEvent_startHalfHour.innerHTML == "30") {
		newEvent_startHalfHour.innerHTML = "45";
	} else {
		newEvent_startHalfHour.innerHTML = "00";
	}
}

function alternateNewEventEndHalfHour(event) {
	var newEvent_endHalfHour = document.getElementById('newEvent_endHalfHour');
	if (newEvent_endHalfHour.innerHTML == "00") {
		newEvent_endHalfHour.innerHTML = "15";
	} else if (newEvent_endHalfHour.innerHTML == "15") {
		newEvent_endHalfHour.innerHTML = "30";
	} else if (newEvent_endHalfHour.innerHTML == "30") {
		newEvent_endHalfHour.innerHTML = "45";
	} else {
		newEvent_endHalfHour.innerHTML = "00";
	}
}

function closeEvent()
{
  // display
  var dialog = document.getElementById('newEvent');
  dialog.style.display = "none";
}

function validateEvent() {
	var form_ok = true;
//	var errors = initErrorsArray();
	var error = null;
	var fullCalEvent = {};
	

	// DAY
	var day;
	var d = document.getElementById("newEvent_day");
	switch (d.innerHTML) {
	case msg.workspace_calendar_monday:
		day = 0;
		break;
	case msg.workspace_calendar_tuesday:
		day = 1;
		break;
	case msg.workspace_calendar_wednesday:
		day = 2;
		break;
	case msg.workspace_calendar_thursday:
		day = 3;
		break;
	case msg.workspace_calendar_friday:
		day = 4;
		break;
	case msg.workspace_calendar_saturday:
		day = 5;
		break;
	case msg.workspace_calendar_sunday:
	default:
		day = 6;
		break;
	}
	
	fullCalEvent.start = new Date(1970, 0, 5,0,0,0,0); // Start at first monday
	// Set to real event day
	fullCalEvent.start.setDate(fullCalEvent.start.getDate() + day);
	fullCalEvent.end = new Date(fullCalEvent.start); // Same date as start

	
	
	// START HOUR
	var sh = document.getElementById('newEvent_startHour');
	var shh = document.getElementById('newEvent_startHalfHour');

	var shValue;
	if (sh.value.length == 2 && sh.value.substring(0, 1) == 0)
		shValue = parseInt(sh.value.substring(1));
	else
		shValue = parseInt(sh.value);

	var startHourFix;
	if (shh.innerHTML == "00") {
		startHourFix = 0;
	} else if (shh.innerHTML == "15") {
		startHourFix = 0.25;
	} else if (shh.innerHTML == "30") {
		startHourFix = 0.5;
	} else if (shh.innerHTML == "45") {
		startHourFix = 0.75;
	}

	if (isNaN(shValue)) {
		docAlert.message(msg.error,
				msg.calendar_error_consultation_start_date_not_a_number);
		return;
	} else if (shValue < 6) {
		docAlert.message(msg.error,
				msg.calendar_error_consultation_start_date_less_than_6);
		return;
	}

	fullCalEvent.start.setHours(shValue, startHourFix * 60, 0, 0);
	var startHour = shValue + startHourFix;

	
	
	// END HOUR
	var eh = document.getElementById('newEvent_endHour');
	var ehh = document.getElementById('newEvent_endHalfHour');

	var ehValue;
	if (eh.value.length == 2 && eh.value.substring(0, 1) == 0)
		ehValue = parseInt(eh.value.substring(1));
	else
		ehValue = parseInt(eh.value);

	var endHourFix;
	if (ehh.innerHTML == "00") {
		endHourFix = 0;
	} else if (ehh.innerHTML == "15") {
		endHourFix = 0.25;
	} else if (ehh.innerHTML == "30") {
		endHourFix = 0.5;
	} else if (ehh.innerHTML == "45") {
		endHourFix = 0.75;
	}

	if (isNaN(ehValue)) {
		docAlert.message(msg.error,
				msg.calendar_error_consultation_end_date_not_a_number);
		return;
	} else if (ehValue > 22 || ehValue == 22 && endHourFix > 0) {
		docAlert.message(msg.error,
				msg.calendar_error_consultation_end_date_greater_than_20);
		return;
	}
	
	fullCalEvent.end.setHours(ehValue, endHourFix * 60, 0, 0);
	var endHour = ehValue + endHourFix;

	
	
	// Verify event duration
	currentEvent.hour = startHour;
	currentEvent.duration = endHour - startHour;
	if (currentEvent.duration < 0) {
		docAlert
				.message(
						msg.error,
						msg.calendar_error_consultation_start_date_greater_than_end_date);
		return;
	} else if (currentEvent.duration < 0.25) {
		docAlert.message(msg.error, msg.calendar_error_consultation_too_small);
		return;
	}

	
	// what
	var opt = document.getElementById("newEvent_what").options[document.getElementById("newEvent_what").selectedIndex];
	var color;
	if (opt.value == "1" || opt.value =="green")
    {
		color = "green";
    }
	else if (opt.value == "2" || opt.value =="blue")
	{
		color = "blue";
	}
	else if (opt.value == "3" || opt.value =="yellow")
	{
		color = "yellow";
	}
	else
	{
		color = "red";
	}
	
	fullCalEvent.color = color;
	fullCalEvent.className = color + "_event_div";
	fullCalEvent.othertype = opt.getAttribute("isOther") ? document.getElementById("newEvent_otherType").value : '';

			
	// where
	opt = document.getElementById("newEvent_where").options[document.getElementById("newEvent_where").selectedIndex];

	if (opt.value == "" || opt.value == "other") {
		fullCalEvent.label = '';
	} else {
		fullCalEvent.label = opt.text;
	}

	fullCalEvent.where = opt.value;

	// info
	fullCalEvent.info = document.getElementById("newEvent_info").value;
	
	// remove old event if is edition
	if (document.getElementById("isEdition").value != "false")
	{
		var editedId = document.getElementById("isEdition").value;
		$j('#calendar').fullCalendar('removeEvents', editedId);
	}
	
	// display
	closeEvent();

	fullCalEvent.title = fullCalEvent.label;
	fullCalEvent.allDay = false;
	$j('#calendar').fullCalendar("renderAfterDialog", fullCalEvent);
}

function showCreateDialog(event, edit) {
	currentEvent = event;
	// date
	var d = document.getElementById("newEvent_day");
	switch (event.start.getDay()) {
	case 1:
		d.innerHTML = msg.workspace_calendar_monday;
		break;
	case 2:
		d.innerHTML = msg.workspace_calendar_tuesday;
		break;
	case 3:
		d.innerHTML = msg.workspace_calendar_wednesday;
		break;
	case 4:
		d.innerHTML = msg.workspace_calendar_thursday;
		break;
	case 5:
		d.innerHTML = msg.workspace_calendar_friday;
		break;
	case 6:
		d.innerHTML = msg.workspace_calendar_saturday;
		break;
	case 0:
	default: d.innerHTML = msg.workspace_calendar_sunday; break;
	}

	// time
	var sh = document.getElementById('newEvent_startHour');
	sh.value = (event.start.getHours() < 10 ? '0' : '') + Math.floor(event.start.getHours());

	var shh = document.getElementById('newEvent_startHalfHour');
	shh.innerHTML = (event.start.getMinutes() < 10 ? '0' : '') + Math.floor(event.start.getMinutes());

	var eh = document.getElementById('newEvent_endHour');
	eh.value = (event.end.getHours() < 10 ? '0' : '') + Math.floor(event.end.getHours());

	var ehh = document.getElementById('newEvent_endHalfHour');
	ehh.innerHTML = (event.end.getMinutes() < 10 ? '0' : '') + Math.floor(event.end.getMinutes());

	// what
	var sWhat = document.getElementById("newEvent_what");
	for (var i = 0; i < sWhat.options.length; i++)
	{
		 if (sWhat.options[i].value == event.color)
		 {
			 sWhat.options[i].selected = true;
			 if (sWhat.options[i].getAttribute("isOther"))
			 {
				 document.getElementById("newEvent_otherType_div").style.display = "";
			 }
			 else
			 {			 
				 document.getElementById("newEvent_otherType_div").style.display = "none";
			 }
			  		
		 }
	}
	document.getElementById("newEvent_otherType").value = event.othertype || '';
	 
	// where
	var sWhere = document.getElementById("newEvent_where");
	if (sWhere != null)
	{
		 if (event.where != undefined) // If it is not a new event
		 {
			 for (var i = 0; i < sWhere.options.length; i++)
			 {
				 var isEventUsingOtherPlace = isNaN(parseInt(event.where, 10));
				 var isOptionForOtherPlace = isNaN(parseInt(sWhere.options[i].value, 10));
				
				 if (sWhere.options[i].value == event.where || (isEventUsingOtherPlace && isOptionForOtherPlace))
				 {
					 sWhere.options[i].selected = true;
				 }
			 }
		 }
	}

	// info
	document.getElementById("newEvent_info").value = event.info ? event.info : "";

	// On fixe la position pour le calendrier V2 (car affiché dans une iframe,
	// donc on est obligé de le centrer)
//	var top = 120;
//	var left = 278;

	if (edit)
		editMode(event._id);
	else
		newMode();

	var dialog = document.getElementById('newEvent');
	dialog.style.top =  ($j(dialog).parent().position().top + 85)+ "px" ;
	dialog.style.left =  ($j(dialog).parent().position().left + 130) + "px";
	dialog.style.display = "";
	try {
		document.getElementById("newEvent_what").focus();
	} catch (e) {}
}

function newMode() {
	document.getElementById("isEdition").value = "false";
	var link = document.getElementById("calendar_delete_link");
	link.style.visibility = "hidden";
}

function editMode(id) {
	document.getElementById("isEdition").value = id;
	var link = document.getElementById("calendar_delete_link");
	link.style.visibility = "";
}

function deleteEvent()
{
	var deletedId = document.getElementById("isEdition").value;
	$j('#calendar').fullCalendar('removeEvents', deletedId);
	
	// display
	closeEvent();
}

function changeType(select)
{
	if (select.options[select.selectedIndex].getAttribute("isOther"))
	{
		document.getElementById("newEvent_otherType_div").style.display = "";
	}
	else
	{
		document.getElementById("newEvent_otherType_div").style.display = "none";
	}
}

function selectPlace (select)
{
	var selectPlace = document.getElementById("newEvent_where");
	var value = select.options[select.selectedIndex].value;
	if (value == "yellow")
	{
		for (var i = 0; i < selectPlace.length; i++)
		{
			if (selectPlace.options[i].value == 'other')
			{
				selectPlace.selectedIndex = i;
			}
		}
	}
}

// Compteur pour l'id des evènements.
var cpt = 0;

function transformEvents(fullCalendarEvents)
{
	var events = {};
	for (var i = 0; i < fullCalendarEvents.length; i++)
	{
		var event = fullCalendarEvents[i];
		var id = "tmp_" + cpt++;
		var label = event["label"];
		var color = event["color"];
		var day = event["end"].getDay() -1;
		var duration = (event["end"] - event["start"]) / 3600000;
		var hour = event["start"].getHours() + (event["start"].getMinutes() / 60);
		var info = event["info"];
		var where = event["where"];
		var othertype = event["othertype"];
		var properties = {where : where, othertype : othertype};
		
		var newEvent = {
				id : id, 
				label : label, 
				color : color, 
				day : day, 
				duration : duration, 
				hour : hour, 
				info : info,
				properties : properties
		};
		
		events[id] = newEvent;
	}
	return events;
}

function getNumberOfEvents()
{
	return $j('#calendar').fullCalendar("clientEvents").length;
}

function sendEvents(callback, additionnalFields)
{
//	var form = document.getElementById("calendar-form");
	
	var events = transformEvents($j('#calendar').fullCalendar("clientEvents"));
    var res = "";
    for(var i in events)
	{
	   res = res + "{";
	   res += events[i]["id"] + "|";
	   res += events[i]["label"] + "|";
	   res += events[i]["info"] + "|";
	   res += events[i]["color"] + "|";
	   res += events[i]["day"] + "|";
	   res += events[i]["hour"] + "|";
	   res += events[i]["duration"] + "|";
	   res += events[i]["properties"]["where"] + "|";
	   res += events[i]["properties"]["othertype"] + "|";
	   res = res + "}";	
	}	 
	
    var data = {inputevents : res, redirect : false};
    
    if (additionnalFields != null && additionnalFields.length > 0)
    {
    	for (var i = 0; i < additionnalFields.length; i ++)
    	{
    		data[additionnalFields[i]] = document.getElementsByName(additionnalFields[i])[0].value;
    	}
    }
	document.getElementById("inputevents").value = res;
	$j.ajax({
		url : saveCalendarUrl,
		type : 'POST',
		data : data,
		success : function(data, textStatus, jqXHR)
		{
			if (callback != null && typeof callback == "function")
			{
				callback(data);
			}
		}, 
		error : function(jqXHR, textStatus, errorThrown)
		{
			alert("Calendar Error : " + errorThrown);
		}
	}); 
	return false;
}


function eventMouseover (event, jsEvent, view)
{
	rempliBullePourEvent(event);
	afficheBulle();
}

function eventMouseout (event, jsEvent, view)
{
	cacheBulle();
}

function eventMousemove (event, jsEvent, view)
{
	var bulleElt = GetId("bulle");
	var left = jsEvent.clientX + ($j(document).scrollLeft()) - 30;
	var top = jsEvent.clientY + ($j(document).scrollTop()) + 120;

	if (typeof calendarThemeOffsetTop != "undefined" && typeof calendarThemeOffsetLeft != "undefined")
	{
		left = left + calendarThemeOffsetLeft;
		top = top + calendarThemeOffsetTop;
	}
	
//	console.log("jsEvent.clientY : " +jsEvent.clientY  + ", $j(bulleElt).parent().offset().top : " + $j(bulleElt).parent().offset().top + ", $j(bulleElt).parent().scrollTop() : "+ $j(bulleElt).parent().scrollTop()+ ", $j(document).scrollTop() : "+ $j(document).scrollTop());
	
	// On verifie que la 'bulle' ne depasse pas du calendrier.
	var calendarDiv = document.getElementById("calendar");
	if ((left + bulleElt.offsetWidth) > (calendarDiv.clientLeft + calendarDiv.offsetWidth))
	{
		left = (left - (bulleElt.offsetWidth + 30));
	}
	
	if ((top + bulleElt.offsetHeight) > (calendarDiv.clientTop+ calendarDiv.offsetHeight))
	{
		top = (top - (bulleElt.offsetHeight));
	}
	
	bulleElt.style.left = left +"px";
	bulleElt.style.top = top + "px";
	
}

function eventClick (event, jsEvent, view)
{
	showCreateDialog(event, true);
}

function cacheBulle() {
	GetId("bulle").style.visibility="hidden"; // Si la bulle etais visible on la cache
	GetId("bulle").style.left="-500px"; // Si la bulle etais visible on la cache
	
}

function afficheBulle ()
{
	if(GetId("bulle").style.visibility == "hidden" || GetId("bulle").style.visibility == "") {
		GetId("bulle").style.visibility = "visible";
		GetId("bulle").innerHTML = document.getElementById("event_display").innerHTML; // Cette fonction est a ameliorer, il parait qu'elle n'est pas valide (mais elle marche)
		GetId("bulle").style.position = "absolute";
	}
}

function GetId(id)
{
	return document.getElementById(id);
}	


function getDateObject(day, time)
{
	var hour = Math.floor(time);
	var minutes = (time - hour) * 60;
	return new Date(1970, 0, (5 + day), hour, minutes);
}

// FONCTIONS DE REMPLISSAGE DE LA BULLE

function rempliBullePourEvent(event)
{
	// Horaires
	$j(".horaire").html(getStringHoraires(event));
	
	// Type
	if (getStringType(event) != "")
	{
		$j("#consultation-type-div .info").show();
		$j("#consultation-type-div .info").html(getStringType(event));
		$j("#consultation-type-div .libelle").show();
		$j("#consultation-type-div .info").show();
	}
	else
	{
		$j("#consultation-type-div .info").hide();
		$j("#consultation-type-div .libelle").hide();
		$j("#consultation-type-div .info").hide();
	}
	
	// Lieu
	if (getStringLieu(event) != "")
	{
		$j("#consultation-lieu-div .info").show();
		$j("#consultation-lieu-div .info").html(getStringLieu(event));
		$j("#consultation-lieu-div .libelle").show();
		$j("#consultation-lieu-div .info").show();
	}
	else
	{
		$j("#consultation-lieu-div .info").hide();
		$j("#consultation-lieu-div .libelle").hide();
		$j(" #consultation-lieu-div.info").hide();
	}
	
	// Informations
	if (getStringInfos(event) != "")
	{
		$j("#consultation-information-div .info").show();
		$j("#consultation-information-div .info").html(getStringInfos(event));
		$j("#consultation-information-div .libelle").show();
		$j("#consultation-information-div .info").show();
		$j(".titre").removeAttr("style");
	}
	else
	{
		$j("#consultation-information-div .info").hide();
		$j("#consultation-information-div .libelle").hide();
		$j("#consultation-information-div .info").hide();
		$j(".titre").css("background-image", "none");
	}
}

function getStringHoraires(event)
{
	// dayXString and hourSuffix are defined in new-editable-calendar.xsl
	var numeroJour = event.start.getDay();
	var jour;
	if (numeroJour == 0)
	{
		jour = sunday + colon;
	}
	if (numeroJour == 1)
	{
		jour = monday + colon;
	}
	if (numeroJour == 2)
	{
		jour = tuesday + colon;
	}
	if (numeroJour == 3)
	{
		jour = wednesday + colon;
	}
	if (numeroJour == 4)
	{
		jour = thursday + colon;
	}
	if (numeroJour == 5)
	{
		jour = friday + colon;
	}
	if (numeroJour == 6)
	{
		jour = saturday + colon;
	}
	
	var heureDebut = event.start.getHours() + hourSuffix + (event.start.getMinutes() == 0 ? "00" : event.start.getMinutes());
	var heureFin = event.end.getHours() + hourSuffix + (event.end.getMinutes() == 0 ? "00" : event.end.getMinutes());
	
	var horaires = heureDebut + ' - ' + heureFin;
	
	return jour + horaires;
}

function getStringType(event)
{
    if (event.othertype)
    {
    	return event.othertype;
    }
    else if (event.color)
	{
		var typeLabel = typeLabels[event.color];
		if (typeof typeLabel == "undefined")
		{
			// try with ids as keys
            if (event.color == "green")
            {typeLabel = typeLabels["1"];}
            else if (event.color == "blue")
            {typeLabel = typeLabels["2"];}
            else if (event.color == "yellow")
            {typeLabel = typeLabels["3"];}
            else
            {typeLabel = typeLabels["4"];}
            
            if (typeof typeLabel == "undefined")
            {
            	 return "";
            }
		}
		return typeLabel;
	}
	return "";
}

function getStringLieu(event)
{
	if (event.label)
	{
		return event.label;
	}
	return "";
}

function getStringInfos(event)
{
	if (event.info)
	{
		return event.info;
	}
	return "";
}

// FIN : FONCTIONS DE REMPLISSAGE DE LA BULLE

function reloadCalendar()
{
	// Save the events
	var showSunday = document.getElementById("showSundayInput").checked;
	var events =  $j('#calendar').fullCalendar("clientEvents");
	
	// Remove the calendar
	$j('#calendar').fullCalendar( 'destroy' );
	
	// Create the calendar with new parameters
	basicCalendarParameters.weekends = showSunday;
	basicCalendarParameters.events = events;
	$j('#calendar').fullCalendar(basicCalendarParameters);
	$j('#calendar').fullCalendar( 'gotoDate', 1970, 0, 5); // First monday of the Date object
}

