/**
 *  ****************************************************************************
 *  File : design/previmer/javascript/previmer_timeconfig.js
 *  vers : 1.1
 *  build: 20070731
 *  Author : Virtualys
 *  ****************************************************************************
 **/

/**
 * ============================================================================= 
 * TimeConfig
 * Parametrage des échantillons 
 * ============================================================================= 
 */ 
TimeConfig = function(domNode) {
	// Unite des échantillons - month, day, hour, minute
	this.unit = $(domNode).attr('fcunit');
	// Date de début des données (les dates antérieures doivent être grisées dans
	// le calendrier)
	var from = $(domNode).attr('from');
	if (from) {
		this.from = parseInt(from, 10);
	}
	else {
		this.from = null; 
	}
	// Nombre d'échantillons (forecast) au delà de la date du jour
	var period = parseInt($(domNode).attr('fcperiod'), 10);
	// Pas entre deux échantillons (en unité ci dessus)
	this.step = parseInt($(domNode).attr('fcstep'), 10);
	// Offset de décalage du premier échantillon de la journée par rapport à
	// minuit UTC (en unité ci dessus)
	this.offset = parseInt($(domNode).attr('fcoffset'), 10);
	
	// Date de fin des données - calculée à partir de la date du jour + le
	// forecast (les dates suivantes doivent être grisées dans le calendrier)
	var now = new Date();
	now.setHours(0); now.setMinutes(0);
	now.setSeconds(0); now.setMilliseconds(0);
	switch (this.unit) {
      case 'minute' :
			now.setUTCMinutes(now.getUTCMinutes() + this.offset + period);
			break;
      case 'hour' :
			now.setUTCHours(now.getUTCHours() + this.offset + period);
			break;
      case 'day' :
 			now.setUTCDate(now.getUTCDate() + this.offset + period);
 			break;
		case 'week' :
			now.setUTCDate(now.getUTCDate() + this.offset + (period * 7));
			break;
	}
   this.calendarTo = new Date( now.getTime()); // Utilisé pour grisé le calendrier
   /**
    * Fin de la période
    * pour les animations
    **/
	now.setUTCMinutes(59);
	now.setUTCHours(23);
	now.setUTCDate(now.getUTCDate() + 1);
	this.to = now.getTime();

}
TimeConfig.prototype = {
/**
 * -----------------------------------------------------------------------------
 * Obtient la liste des heures valides pour un jour en particulier, exprimé en
 * heure locale .
 * @param day le jour considéré
 */
	'getValidHours' : function(day) {
		// On se positionne à minuit heure locale
		day = new Date(day.getTime());
		day.setHours(0); day.setMinutes(0);
		day.setSeconds(0); day.setMilliseconds(0);
		
		// Calcul du premier élément de la liste
		switch (this.unit) {
      	case 'minute' :
				var timeInDay = this.step
					- (day.getUTCHours() * 60 + day.getUTCMinutes() - this.offset) % this.step;
				if (timeInDay == this.step) {
					timeInDay = 0;
				}
				else {
					timeInDay *= 60 * 1000;
 				}
				var hoursOnly = (this.offset % 60 == 0) && (this.step % 60 == 0);
				var step = this.step * 60 * 1000;
				break;
				
        	case 'hour' :
				var timeInDay = this.step - (day.getUTCHours() - this.offset) % this.step;
				if (timeInDay == this.step) {
					timeInDay = 0;
				}
				else {
					timeInDay *= 60 * 60 * 1000;
				}
				var hoursOnly = true;
				var step = this.step * 60 * 60 * 1000;
				break;
      }
		
		// Positionnement sur le premier élément
		var midnight = day.getTime();
		// On fixe la limite à 24 heures plus tard (en heure locale)
		day.setDate(day.getDate() + 1);
		var limit = day.getTime();
		
		// On parcourt l'ensemble des valeurs jusqu'à dépasser la valeur limite
		var hours = [];
		while (midnight + timeInDay < limit) {
			day.setTime(midnight + timeInDay);
			var label = '';
			if (day.getHours() < 10) {
				label = '0';
			}
			label += day.getHours() + 'h';
			if (!hoursOnly) {
				if (day.getMinutes() < 10) {
					label += '0';
				}
				label += day.getMinutes();
			}
			hours.push([ label, timeInDay ]);
			timeInDay += step;
		}
		
		// On renvoit le résultat
		return hours;
	},
	
/**
 * Obtient une heure formaté pour l'affichage
 */
	'getFormatedHour' : function( hourOffset, date )
	{
	    if ( date )
	        date = new Date(date.getTime());
		else
		    date = new Date();
		date.setHours(0); date.setMinutes(0);
		date.setSeconds(0); date.setMilliseconds(0);

		date.setTime( date.getTime() + hourOffset );
		var formatedHour = ( date.getHours() < 10 ? '0' : '' ) + date.getHours() + ':';
		formatedHour += ( date.getMinutes() < 10 ? '0' : '' ) + date.getMinutes();
	    return formatedHour;
	}
}
