﻿/** Requis 
shortCuts.js
rescueFrame.js
**/

// Object
var calendars = new Array();
function calendar(type,field,caller,start,end){
	this.index = calendars.length;
	this.type = type;
	this.field = field;
	this.caller = caller;
	this.caller.index = this.index;
	this.start = (!start)? 0 : start;
	this.end = (!end)? 99999999 : end;
	calendars[this.index] = this;
	// Actions
	this.caller.onclick = function(){ launchCalendar(this.index); }
	if(this.type == 'simple'){
		_('calendar'+this.index,'input',1).index = this.index;
		_('calendar'+this.index,'input',1).onblur = function(){
			var output = parseFloat(this.value.split('/')[2]+this.value.split('/')[1]+this.value.split('/')[0]);
			_('calendar'+this.index,'input',0).value = output;
		}
	} else {
		_('calendar'+this.index,'select',0).index = this.index;
		_('calendar'+this.index,'select',0).onchange = function(){
			var other = _('calendar'+this.index,'select',1);
			var output = parseFloat(other.value.split('/')[1]+other.value.split('/')[0]+this.value);
			_('calendar'+this.index,'input',0).value = output;
		}
		_('calendar'+this.index,'select',1).index = this.index;
		_('calendar'+this.index,'select',1).onchange = _('calendar'+this.index,'select',1).onblur = function(){
			var other = _('calendar'+this.index,'select',0);
			var output = parseFloat(this.value.split('/')[1]+this.value.split('/')[0]+other.value);
			_('calendar'+this.index,'input',0).value = output;
			updateDayField(other.value,this.value,this.index);
		}
		updateDayField('00',_('calendar'+this.index,'select',1).value,this.index);
		if(isIE && !isIE7){
			_('calendar'+this.index,'select',0).onfocus = function(){ closeCalendar(); }
			_('calendar'+this.index,'select',1).onfocus = function(){ closeCalendar(); }
		}
	}
}

// Variables
var calendarField;
var calendarCaller;
var tempDay;
var tempMonth;
var tempYear;

// Récupère la date client
var clientDate = new Date();
var currentDay = (clientDate.getDate() < 10)? '0'+clientDate.getDate() : clientDate.getDate();
var currentMonth = ((clientDate.getMonth()+1) < 10)? '0'+(clientDate.getMonth()+1) : (clientDate.getMonth()+1);
var currentYear = clientDate.getFullYear();
var currentDate = parseFloat(currentYear+currentMonth+currentDay);

// Utiles
var dayTab = new Array('L','M','M','J','V','S','D');
var dayTabMid = new Array('Dim.','Lun.','Mar.','Mer.','Jeu.','Ven.','Sam.');
var monthTab = new Array('Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre');

function isBissextile(year){
	if(year%4 != 0){
		return false;
	}
	return true;
}

function getFirstDayOf(month,year){
	var targetDate = new Date();
	targetDate.setDate(1);
	targetDate.setMonth(parseFloat(month-1));
	targetDate.setFullYear(parseFloat(year));
	var firstDay = (targetDate.getDay() == 0)? 6 : (targetDate.getDay()-1);
	return firstDay;
}

function getMaxDays(month,year){
	switch(month){
		case 1: case 3: case 5: case 7: case 8: case 10: case 12: 
			var maxDay = 31;
		break;
		case 4: case 6: case 9: case 11: 
			var maxDay = 30;
		break;
		case 2:
			var maxDay = (isBissextile(year))? 29 : 28;
		break;
		default:
			var maxDay = 31;
		break;
	}
	return maxDay;
}

// Builder
function buildCalendar(month,year,index){
	var calendar = calendars[index];
	var month = (month.length == 1)? '0'+month : month;
	
	var targetMonth = parseFloat(month-1);
	var targetYear = parseFloat(year);
	
	var limitStart = false;
	var limitEnd = false;
	
	if(calendar.type == 'double'){
		var currentRequest = parseFloat(year+month);
		if(currentRequest < calendar.start){
			var startString = calendar.start+'';
			buildCalendar(startString.substr(4,2),startString.substr(0,4),index);
			return;
		} else if(currentRequest > calendar.end){
			var endString = calendar.end+'';
			buildCalendar(endString.substr(4,2),endString.substr(0,4),index);
			return;
		}
		limitStart = (currentRequest == calendar.start)? true : false;
		limitEnd = (currentRequest == calendar.end)? true : false;
	} else {
		limitStart = false;
		limitEnd = false;
	}
	
	// Changement d'année
	if(targetMonth < 0){
		buildCalendar('12',(targetYear-1)+'',index);
		return;
	} else if(targetMonth > 11){
		buildCalendar('01',(targetYear+1)+'',index);
		return;
	}
	
	var htmlRender = '';
	// Entete
	htmlRender += '<div class="calCont">\n';
	htmlRender += '\t<a href="javascript:closeCalendar();" class="calClose" title="Cliquez ici pour refermer le calendrier."><img src="Includes/Images/Pictos/calendar.gif" alt="Cliquez ici pour refermer le calendrier." /></a>\n';
	htmlRender += '\t<div class="calTitle">Calendrier</div>\n';
	htmlRender += '\t<div class="calNav">\n';
	htmlRender += '\t\t<div class="calMonth">\n';
	htmlRender += '\t\t\t<a href="#0" onclick="buildCalendar(\''+targetMonth+'\',\''+targetYear+'\','+index+');" class="prevCalendar">&laquo;</a><span class="monthCalendar" onclick="updateCalField(\''+year+''+month+'00\','+index+');">'+monthTab[targetMonth]+'</a></span><a href="#0" onclick="buildCalendar(\''+(targetMonth+2)+'\',\''+targetYear+'\','+index+');" class="nextCalendar">&raquo;</a>\n';
	htmlRender += '\t\t</div>\n';
	htmlRender += '\t\t<div class="calYear">\n';
	htmlRender += '\t\t\t<a href="#0" onclick="buildCalendar(\''+(targetMonth+1)+'\',\''+(targetYear-1)+'\','+index+');" class="prevCalendar">&laquo;</a><span class="yearCalendar">'+targetYear+'</span><a href="#0" onclick="buildCalendar(\''+(targetMonth+1)+'\',\''+(targetYear+1)+'\','+index+');" class="nextCalendar">&raquo;</a>\n';
	htmlRender += '\t\t</div>\n';
	htmlRender += '\t</div>\n';
	// Semaine
	htmlRender += '\t<div class="calLegend">\n';
	for(i=0; i<dayTab.length; i++){
		htmlRender += '\t\t<span>'+dayTab[i]+'</span>\n';
	}
	htmlRender += '\t\t<div class="clear"></div>\n';
	htmlRender += '\t</div>\n';
	// Jours
	var currentDay = 1;
	var maxDay = getMaxDays((targetMonth+1),targetYear);
	var firstDay = getFirstDayOf((targetMonth+1),targetYear);
	
	var maxWeek = Math.floor((maxDay+firstDay)/7);
	maxWeek = (maxWeek == (maxDay+firstDay)/7)? maxWeek : maxWeek+1;
	var maxWeekDays = maxWeek*7;
	
	var prevMonth = (targetMonth == 0)? 12 : targetMonth;
	var prevYear = (targetMonth == 0)? (targetYear-1) : targetYear;
	var prevMonthFirst = getMaxDays(prevMonth,prevYear)-firstDay+1;
	
	var nextMonth = (targetMonth == 11)? 1 : targetMonth+2;
	var nextYear = (targetMonth == 11)? (targetYear+1) : targetYear;
	var nextMonthDay = 1;
	
	htmlRender += '\t<div class="calDays">\n';
	for(i=0; i<maxWeekDays; i++){
		if(i < firstDay){
			var updateMonth = (prevMonth < 10)? '0'+prevMonth : prevMonth;
			var updateYear = prevYear;
			var calOn = (updateDay == tempDay && updateMonth == tempMonth && updateYear == tempYear)? ' on' : '';
			if(limitStart == false){
				htmlRender += '\t\t<a class="calOld'+calOn+'" href="#0" onclick="updateCalField(\''+updateYear+''+updateMonth+''+prevMonthFirst+'\','+index+');">'+prevMonthFirst+'</a>\n';
			} else {
				htmlRender += '\t\t<span class="calOld'+calOn+'">&nbsp;</span>\n';
			}
			prevMonthFirst ++;
		} else if(i >= firstDay && i < (maxDay+firstDay)){
			var updateDay = (currentDay < 10)? '0'+currentDay : currentDay;
			var updateMonth = ((targetMonth+1) < 10)? '0'+(targetMonth+1) : (targetMonth+1);
			var updateYear = targetYear;
			var calOn = (updateDay == tempDay && updateMonth == tempMonth && updateYear == tempYear)? ' class="on"' : '';
			htmlRender += '\t\t<a'+calOn+' href="#0" onclick="updateCalField(\''+updateYear+''+updateMonth+''+updateDay+'\','+index+');">'+currentDay+'</a>\n';
			currentDay ++;
		} else if(limitEnd == false){
			var updateDay = (nextMonthDay < 10)? '0'+nextMonthDay : nextMonthDay;
			var updateMonth = (nextMonth < 10)? '0'+nextMonth : nextMonth;
			var updateYear = nextYear;
			var calOn = (updateDay == tempDay && updateMonth == tempMonth && updateYear == tempYear)? ' on' : '';
			htmlRender += '\t\t<a class="calOld'+calOn+'" href="#0" onclick="updateCalField(\''+updateYear+''+updateMonth+''+updateDay+'\','+index+');">'+nextMonthDay+'</a>\n';
			nextMonthDay ++;
		}
	}
	htmlRender += '\t\t<div class="clear"></div>\n';
	htmlRender += '\t</div>\n';
	htmlRender += '</div>\n';
	
	// innerHTML
	if(!_('calendar')){
		var calendarObj = document.createElement('div');
		var calendarElement = document.body.appendChild(calendarObj);
		calendarElement.id = 'calendar';
		calendarElement.style.visibility = 'hidden';
		calendarElement.style.top = '-999px';
		calendarElement.style.left = '-999px';
		var calendarOuterObj = document.createElement('div');
		var calendarOuterElement = document.body.appendChild(calendarOuterObj);
		calendarOuterElement.id = 'calendarOuter';
		calendarOuterElement.style.visibility = 'hidden';
		calendarOuterElement.onclick = closeCalendar;
		var firstBuild = true;
	} else {
		var firstBuild = false;
	}
	_('calendar').innerHTML = htmlRender;
	var parent = _('calendar').parentNode;
	var frame = __('iframe','rescue',parent)[0];
	if(isIE && !isIE7 && frame){
		endRescueFrame(_('calendar'));
		rescueFrame(_('calendar'));
	}
	if(firstBuild == true || _('calendar').style.visibility == 'hidden'){
		openClandar(index);
	}
}

// Launcher
function launchCalendar(index){
	if(_('calendar') && _('calendar').style.visibility == 'visible') closeCalendar();
	
	var calendar = calendars[index];
	var intOnly = new RegExp('^[0-9]{6,8}$','gi');
	var isInt = intOnly.test(calendar.field.value);
	var tempValue = (calendar.field.value != '')? calendar.field.value+'' : currentDate+'';
	if(tempValue.length == 6 && isInt){
		tempDay = 0;
		tempMonth = tempValue.substr(4,2);
		tempYear = tempValue.substr(0,4);
	} else if(tempValue.length == 8 && isInt){
		tempDay = tempValue.substr(6,2);
		tempMonth = tempValue.substr(4,2);
		tempYear = tempValue.substr(0,4);
	} else {
		tempDay = 0;
		tempMonth = tempValue.substr(4,2);
		tempYear = tempValue.substr(0,4);
	}
	buildCalendar(tempMonth,tempYear,index);
}

function openClandar(index){
	var calendar = calendars[index];
	// Affichage du calendrier
	_('calendar').style.top = (_C('y',calendar.caller)-5)+'px';
	_('calendar').style.left = (_C('x',calendar.caller)-5)+'px';
	_('calendar').style.visibility = 'visible';
	// Affichage du Outer
	_('calendarOuter').style.visibility = 'visible';
	// iFrame de secour pour IE6
	rescueFrame(_('calendar'));
}

// Mise à jour du champ
function updateCalField(value,index){
	var calendar = calendars[index];
	calendar.field.value = value;
	var newYear = value.substr(0,4);
	var newMonth = value.substr(4,2);
	var newDay = value.substr(6,2);
	if(calendar.type == 'double'){
		updateMonthField(newDay,newMonth+'/'+newYear,index);
	} else if(calendar.type == 'simple'){
		var output = (newDay == '00')? newMonth+'/'+newYear : newDay+'/'+newMonth+'/'+newYear;
		_('calendar'+index,'input',1).value = output;
	}
	// Masquage du calendrier
	closeCalendar();
}

function updateMonthField(day,month,index){
	var field = _('calendar'+index,'select',1);
	var length = field.length
	for(var i =0; i<length; i++){
		if(month == field[i].value){
			field[i].selected = true;
		} else {
			field[i].selected = false;
		}
	}
	updateDayField(day,month,index);
}

function updateDayField(day,month,index){
	var year = month.split('/')[1];
	var month = month.split('/')[0];
	
	var dayLength = getMaxDays(parseFloat(month),parseFloat(year));
	var day = (parseFloat(day) > dayLength)? '00' : day;
	var dayField = _('calendar'+index,'select',0);
	var dayFieldLength = dayField.length;
	// Vide la liste
	for(var i=1; i<dayFieldLength; i++){
		dayField.removeChild(dayField[1]);
	}
	// Rempli la liste
	var selectDate = new Date();
	selectDate.setFullYear(parseFloat(year));
	selectDate.setMonth(parseFloat(month)-1);
	for(var i=1; i<=dayLength; i++){
		selectDate.setDate(i);
		var dayName = dayTabMid[selectDate.getDay()];
		var opt = document.createElement('option');
		var val = (i<10)? '0'+i : i+'';
		var text = document.createTextNode(dayName+' '+i);
		opt.appendChild(text);
		opt.setAttribute('value',val);
		dayField.appendChild(opt);
	}
	// Active la liste
	var newLength = dayField.length;
	for(var i=0; i<newLength; i++){
		if(day == dayField[i].value){
			dayField[i].selected = true;
		} else {
			dayField[i].selected = false;
		}
	}
}

// Fermeture du calendrier
function closeCalendar(){
	if(_('calendar')){
		// Masquage du calendrier
		_('calendar').style.visibility = 'hidden';
		// Masquage du Outer
		_('calendarOuter').style.visibility = 'hidden';
		// Cache iFrame de secour pour IE6
		endRescueFrame(_('calendar'));
	}
}

// A appeler au chargement pour poser les evènements
function calendarEvents(){
	var calendTab = __('div','calendar');
	for(i=0; i<calendTab.length; i++){
		calendTab[i].id = 'calendar'+i;
		var type = (_('calendar'+i,'select',-1).length > 1)? 'double' : 'simple';
		var field = _('calendar'+i,'input',0);
		var caller = _('calendar'+i,'a',0);
		var start = (type == 'double')? parseFloat(_('calendar'+i,'select',1)[0].value.split('/')[1]+_('calendar'+i,'select',1)[0].value.split('/')[0]) : false;
		var end = (type == 'double')? parseFloat(_('calendar'+i,'select',1)[_('calendar'+i,'select',1).length-1].value.split('/')[1]+_('calendar'+i,'select',1)[_('calendar'+i,'select',1).length-1].value.split('/')[0]) : false;
		new calendar(type,field,caller,start,end);
	}
}