/******************************************
# Auteur : Julien Theler - www.twiip.ch
# Contact : julien.theler@twiip.ch
# Licence : CC-by-nc
******************************************/

var monthList = new Array('Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre');

var calendar;
var calendar_element;
var days_element;
var month_element;
var year_element;
var input_element;

function addCalendar(element){
	if(document.getElementById('twiipCalendar')){
		return false;
	}
	
	var script_dir = getJsDir('twiipCalendar.js');

	input_element = element;
	
	calendar = document.createElement('div');
	calendar.id = 'twiipCalendar';
	calendar.innerHTML =
		'<h1><a href="javascript:closeCalendar();"><img src="'+script_dir+'delete.png" title="fermer" /></a>Choisissez une date...</h1>'+"\n"+
		'<table>'+"\n"+
		'	<tr>'+"\n"+
		'		<th colspan="7" id="twiipCalendarMonthyear">'+"\n"+
		'			<a href="javascript:changeMonth(-1);" style="float: left;" title="mois précédent"><img src="'+script_dir+'arrowleft.png" /></a>'+"\n"+
		'			<a href="javascript:changeMonth(1);" style="float: right;" title="mois suivant"><img src="'+script_dir+'arrowright.png" /></a>'+"\n"+
		'			<div id="twiipCalendarMonth"></div>'+"\n"+
		'			<select id="twiipCalendarYear" onchange="changeYear(this.value);"></select>'+"\n"+
		'		</th>'+"\n"+
		'	</tr>'+"\n"+
		'	<tr>'+"\n"+
		'		<th cla>Lu</th>'+"\n"+
		'		<th>Ma</th>'+"\n"+
		'		<th>Me</th>'+"\n"+
		'		<th>Je</th>'+"\n"+
		'		<th>Ve</th>'+"\n"+
		'		<th>Sa</th>'+"\n"+
		'		<th>Di</th>'+"\n"+
		'	</tr>'+"\n"+
		'	<tr><td id="twiipCalendarDays" colspan="7"></td></tr>';
		
	document.body.appendChild(calendar);
	
	calendar.style.left = findPos(element)[0]+element.offsetWidth+'px';
	calendar.style.top = findPos(element)[1]+'px';
	calendar.style.position = 'absolute';
	
	var date = new Date();
	if(element.value){
		var inputToDate = titleToDate(element.value);
		if(inputToDate) date = inputToDate;
	}
	
	initCalendar(date);
}

function closeCalendar(){
	if(document.getElementById('twiipCalendar')){
		document.body.removeChild(calendar);
	}
}

function initCalendar(date){
	calendar_element = calendar.getElementsByTagName('table')[0];
	days_element = document.getElementById('twiipCalendarDays');
	month_element = document.getElementById('twiipCalendarMonth');
	year_element = document.getElementById('twiipCalendarYear');

	//Construction de la liste des années
	var year = date.getFullYear();
	for(var i = year-5; i<=year+5; i++){
		var option = document.createElement('option');
		option.innerHTML = i;
		option.value = i;
		if(i == year) option.selected = true;
		year_element.appendChild(option);
	}
	
	//On met l'élément en position absolue pour pouvoir le déplacer
	var title = calendar.getElementsByTagName('h1')[0];
	title.onmousedown = function(){
		drag(this.parentNode);
	};
	document.onmouseup = function(){ drag(); };
	
	//On remplit le calendrier avec les infos actuelles
	updateCalendar(date);
}

function getDateFromDisplay(){
	var days = calendar_element.getElementsByTagName('span');
	var day = null;
	for(var i=0; i<days.length; i++){
		if(days[i].className == 'current'){
			var dayText = days[i].innerHTML;
			dayText = dayText.replace(/<u>/ig, '');
			dayText = dayText.replace(/<\/u>/ig, '');
			day = parseInt(dayText);
		}
	}
	
	var month = null;
	var monthText = month_element.innerHTML;
	for(var key=0; key<monthList.length; key++){
		if(monthList[key] == monthText) month = key;
	}

	var year = parseInt(year_element.value);
	
	var newDate = new Date(parseInt(year), parseInt(month), parseInt(day));
	return newDate;
}

function titleToDate(title){
	var array = title.split('.');
	var day = parseInt(array[0],10);
	var month = parseInt(array[1],10)-1;
	var year = parseInt(array[2],10);
	var newDate = new Date(year, month, day)
	return (isNaN(newDate) ? false : newDate);
}

function changeMonth(way){
	var date = getDateFromDisplay();
	var newDate = new Date(date.getFullYear(), (date.getMonth()+way), date.getDate());
	updateCalendar(newDate)
}

function changeYear(year){
	year = parseInt(year);
	var date = getDateFromDisplay();
	var newDate = new Date(year, date.getMonth(), date.getDate());
	
	year_element.innerHTML = '';
	for(var i=year-5; i<=year+5; i++){
		var option = document.createElement('option');
		option.innerHTML = i;
		option.value = i;
		if(i == year) option.selected = true;
		year_element.appendChild(option);
	}
	
	updateCalendar(newDate)
}

function updateCalendar(date){
	//Affichage du mois
	month_element.innerHTML = monthList[date.getMonth()];
	
	//Affichage de l'année
	var options = year_element.getElementsByTagName('option');
	for(var i=0; i<options.length; i++){
		if(options[i].value == date.getFullYear()){
			year_element.selectedIndex = i;
		}
	}
	
	//On recherche le premier jour à afficher
	var newDate = new Date(date.getFullYear(), date.getMonth(), 1);
	var firstMonthDay = (newDate.getDay() == 0 ? 7 : newDate.getDay());
	var newDate = new Date(date.getFullYear(), date.getMonth(), (2-firstMonthDay));
	
	//On remplit la liste des jours
	days_element.innerHTML = '';
	
	var table = document.createElement('table');
	var tbody = document.createElement('tbody');
	
	var tr = document.createElement('tr');
	var td_count = 0;
	var othermonth = -1;
	
	while(!(td_count == 7 && othermonth == 1)){
		if(td_count == 7){
			td_count = 0
		}

		var td = document.createElement('td');
		td.className = (newDate.getMonth() == date.getMonth() ? null : 'twiipCalendarOthermonth');
		
		var span = document.createElement('span');
		span.className = (newDate.getDate() == date.getDate() && newDate.getMonth() == date.getMonth() ? 'current' : '');
		span.innerHTML = (newDate.getDate() == new Date().getDate() &&  newDate.getMonth() == new Date().getMonth() ? '<u>'+newDate.getDate()+'</u>' : newDate.getDate());
		
		var day = (newDate.getDate() < 10 ? '0' : '')+newDate.getDate();
		var month = newDate.getMonth()+1;
		month = (month < 10 ? '0' : '')+month;
		var year = newDate.getFullYear()
		var title = day+'.'+month+'.'+year;
		
		span.title = title
		span.onclick = function(){ 
			input_element.value = this.title;
			// Extend Manu 
			var input_date_end = document.getElementById('date_end');
			if(input_date_end.value == ''){
				input_date_end.value = this.title;
			}
			closeCalendar();
		};
		td.appendChild(span);
		tr.appendChild(td);
		td_count++;
		
		if(td_count == 7){
			tbody.appendChild(tr);
			tr = document.createElement('tr');
		}
		
		newDate = new Date(newDate.getFullYear(), newDate.getMonth(), (newDate.getDate()+1));
		if(newDate.getMonth() == date.getMonth()){
			othermonth = 0;
		}
		else if(othermonth == 0){
			othermonth = 1;
		}
	}
	
	table.appendChild(tbody);
	days_element.appendChild(table);
}

function drag(element){
	var diffx = 0;
	var diffy = 0;
	
	if(element){
		document.onmousemove = function(e){
			//position de la souris
			x = (!isIE() ? e.pageX : event.x+document.documentElement.scrollLeft);
			y = (!isIE() ? e.pageY : event.y+document.documentElement.scrollTop);
			//position de l'élément
			element_x = findPos(element)[0];
			element_y = findPos(element)[1];
			
			//Calcul des distances de la souris par rapport aux bords de l'élément
			if(!diffx && !diffy){
				diffx = x-element_x;
				diffy = y-element_y;
			}
			
			var left = x-diffx;
			var top = y-diffy;
			
			element.style.left =left+'px';
			element.style.top = top+'px';
		}
	}
	else{
		document.onmousemove = '';
	}
}

//Détection du navigateur
function isIE(){
	return ((navigator.userAgent.toLowerCase().indexOf("msie") != -1) && (navigator.userAgent.toLowerCase().indexOf("opera") == -1));
}

//Retourne la position absolue d'un objet
function findPos(obj){
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft, curtop];
}

//Retourne le chemin du dossier dans lequel se trouve le fichier js demandé en paramètre
function getJsDir(js_file){
	var dir = '';
	
	var scripts = document.getElementsByTagName('head')[0].getElementsByTagName('script');
	for(var i=0; i<scripts.length; i++){
		var src = scripts[i].src.split('/');
		var file = src[(src.length-1)];
		
		if(file == js_file){
			for(var j=0; j<(src.length-1); j++){
				dir += src[j]+'/';
			}
		}
	}

	return dir;
}