$(document).ready(function() {
	$("calendar img.maskable").each(function() {		
		$(this).click(function() {
			var target = "#" + $(this).attr("data-target");
			if($(target).attr("class") == "details") {
				$(target).removeClass("details");
				$(target).addClass("calendar_to_hide");
				$(target).css('visibility', 'visible');
				$(this).parent().parent().removeClass("event_to_move");
				$(target).show();
			} else {
				$(target).removeClass("calendar_to_hide");
				$(target).addClass("details");
				$(target).css('visibility', 'hidden');
				$(target).hide();
			}
		})
	});

	$(".calendarm .event").each(function() {
		$(this).click(Calendar_Click);
	});

	$(".calendarw .event").each(function() {
		$(this).click(Calendar_Click);
	});

	$().keydown(function(e) {
		Calendar_KeyDown(e);
	});

	$("td.clickable a").each(function() {
		$(this).click(function() {
			window.location.href = $(this).attr("href");
		})
	});
});

function close_all_details() {
	$('div.calendar_to_hide').each(function(index) {
		$(this).removeClass("calendar_to_hide");
		$(this).addClass("details");
		$(this).css('visibility', 'hidden');
		$(this).css('display', 'none');
		$(this).hide();
	});
};

function Calendar_Click() {
	if ($(this).parent().attr("class") == "event_to_move") {
		$(this).parent().removeClass("event_to_move");
	} else {
		$("div").removeClass("event_to_move");
		$(this).parent().fadeOut("fast");
		$(this).parent().fadeIn("fast");
		$(this).parent().addClass("event_to_move");
	}
	return false;
};


function Calendar_KeyDown(e) {
	var touche = e.keyCode;

	if ($(".calendarm").length == 1) {
		switch(touche) {
			case 27: //Escape
				$(".event_to_move").removeClass("event_to_move");
				close_all_details();
				break;

			case 37: //Gauche
				if ($(".event_to_move").parent().prev().length == 0) {
					return false;
				}

				$(".event_to_move").parent().prev().append($(".event_to_move"));
				break;

			case 38: //Haut
				if ($(".event_to_move").parent().parent().prev().prev().prev().length == 0) {
					return false;
				}

				var index = GetIndex();
				$(".event_to_move").appendTo($(".event_to_move").parent().parent().prev().children()[index]);
				break;

			case 39: //Droite
				if ($(".event_to_move").parent().next().length == 0) {
					return false;
				}

				$(".event_to_move").parent().next().append($(".event_to_move"));
				break;

			case 40: //Bas
				if ($(".event_to_move").parent().parent().next().length == 0) {
					return false;
				}

				var index = GetIndex();
				$(".event_to_move").appendTo($(".event_to_move").parent().parent().next().children()[index]);
				break;

			default:
				break;
		}

		$(".event_to_move input[@name$='[day]']").val($(".event_to_move").parent().attr("data-day"));

	} else if ($(".calendarw").length == 1) {
		var difference = 0;
		
		switch(touche) {
			case 27: //Escape
				$(".event_to_move").removeClass("event_to_move");
				close_all_details();
				break;

			case 37: //Gauche
				difference = GetDifference();

				$(".event_to_move").parent().prev().append($(".event_to_move"));

				break;

			case 38: //Haut
				if ($(".event_to_move").parent().parent().prev().prev().prev().prev().length == 0) {
					return false;
				}

				difference = GetDifference();

				var index = GetIndex();
				$(".event_to_move").appendTo($(".event_to_move").parent().parent().prev().prev().children()[index]);
				break;

			case 39: //Droite
				difference = GetDifference();

				$(".event_to_move").parent().next().append($(".event_to_move"));
				break;

			case 40: //Bas
				difference = GetDifference();

				var index = GetIndex();
				$(".event_to_move").appendTo($(".event_to_move").parent().parent().next().next().children()[index]);
				break;

			default:
				break;
		}

		var time_of_day = parseInt($(".event_to_move").parent().attr("data-day"));
		$(".event_to_move input[@name$='[day]']").val(time_of_day + difference);
	} 
};

function GetIndex() {
	var index = null;
	$(".event_to_move").parent().parent().children().each(function(i) {
		if ($(this).html().search(/event_to_move.+/) != -1) {
			index=i;
			return false;
		}
	});

	return index;
}

function GetDifference() {
	var time_event = parseInt($(".event_to_move input[@name$='[day]']").val());
	var time_day = parseInt($(".event_to_move").parent().attr("data-day"));
	var difference = time_event - time_day;

	return difference;
}
