/**
 * triTable plugin
 *
 */

/* définition des constants du plusgin */
CAL_TYPE_JOUR_SIMPLE = 0;
CAL_TYPE_JOUR_DOUBLE = 1;
CAL_TYPE_MOIS = 2;
CAL_CHOIX_UNIQUE = 0;
CAL_CHOIX_DOUBLE = 1;
CAL_CHOIX_MULTIPLE = 2;
TAB_JOUR_MINI = new Array('Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa', 'Di');
TAB_JOUR = new Array('Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi');
TAB_MOIS = new Array('', 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre');

(function($){

	$.calendrier = function(jEl, param) {

		param = $.extend({
			type : CAL_TYPE_JOUR_SIMPLE,
			choix : CAL_CHOIX_UNIQUE,
			listeDate : '',
			mois : null,
			annee : null,
			action_valide : null,
			action_fermer : null
		},param);

		var dateJour = $.calendrier.dateArray('')['date'];
		var date = dateJour;
		temp = param.listeDate.split('|');
		temp.sort();
		for(i in temp) {
				date = temp[i];
				if ( dateJour <= date ) break;
			}
		if ( date < dateJour) date = temp[0];
		date = $.calendrier.dateArray( date );
		param.annee = date['a'];
		param.mois = date['m'];
		
		if ( param.listeDate!= '' && (param.choix == CAL_CHOIX_MULTIPLE || param.choix == CAL_CHOIX_MULTIPLE) )
			param.listeDate = param.listeDate + '|';
		
		if ( param.type == CAL_TYPE_JOUR_DOUBLE)
			ajouterCadreJourDouble();	
		else if ( param.type == CAL_TYPE_JOUR_SIMPLE)
			ajouterCadreJourSimple();	
	
		/*
		 * @name ajouterCadreJourDouble
		 * @desc ajoute un calendrier contenant 2 mois à un element jquery
		 * return void
		 */	  
		function ajouterCadreJourDouble() {
			jEl.html('');
			var annee = param.mois == 12 ? param.annee +' / '+ (parseInt(param.annee) + 1) : param.annee;
			jEl.append('<div class="cdAnnee"><span href="#">&lt;&lt;</span> '+ annee +' <span href="#">&gt;&gt;</span></div>');
			jEl.append(tableauJour(param.mois, param.annee, 1) );
			jEl.append(tableauJour(param.mois+1, param.annee, 2) );
			jEl.append('<div class="bt"><span name="valider">Valider</span><span name="fermer">Fermer</span></div>');
			
			action();
		}
		/*
		 * @name ajouterCadreJourSimple
		 * @desc ajoute un calendrier contenant 1 mois à un element jquery
		 * return void
		 */	  
		function ajouterCadreJourSimple() {
			jEl.html('');
			//jEl.append('<div class="cdAnnee"><span href="#">&lt;&lt;</span> '+ param.annee +' <span href="#">&gt;&gt;</span></div>');
			jEl.append(tableauJour(param.mois, param.annee, 0) );
			if ( param.action_fermer != null )
				jEl.append('<div class="bt"><span name="fermer">Fermer</span></div>');
			
			action();
		}

		/*
		 * @name tableauJour
		 * @desc retourne un tableau de sélection pour un mois donné
		 * return element jquery
		 */
		function tableauJour(mois, annee, num){
			if ( mois == 13 ){ mois = 1; annee++;}
	
			var cd = $('<div class="cadreMois"></div>');
			if ( num == 0 )
				cd.append('<div class="titreMois"><div class="droit">&gt;&gt;</div><div class="gauche">&lt;&lt;</div>'+TAB_MOIS[mois]+'</div>');
			else if ( num == 1 )
				cd.append('<div class="titreMois"><div class="gauche">&lt;&lt;</div>'+ TAB_MOIS[mois] +'</div>');
			else if ( num == 2 )
				cd.append('<div class="titreMois"><div class="droit">&gt;&gt;</div>'+ TAB_MOIS[mois] +'</div>');
				var e = $('<table></table>');
			cd.append(e);
			var f = $('<tr></tr>');
			for ( var i=0; i<7; i++)
				f.append('<th id="coljour_'+ (i==6?0:i+1) +'">'+ TAB_JOUR_MINI[i] +'</th>');
	
			e.append(f);
			var dt = new Date(annee, mois-1, 1 );
			var aDt = $.calendrier.dateArray( dt );
			var nbJour = $.calendrier.nbJourMois(mois, annee);
			dt.setDate(2 - ( aDt['numJ'] == 0 ? 7 : aDt['numJ']) );
			aDt = $.calendrier.dateArray( dt );
			do {
				var g = $('<tr></tr>');
				for (i = 1; i <=7; i++){ // les jours
					if ( (num == 1 && mois < aDt['m']) || (num == 2 &&  mois > aDt['m'] ) )
						g.append('<td>&nbsp;</td>');
					else {
						var classe = 'jour';
						if ( param.listeDate.indexOf(aDt['date']) != -1 ) classe = classe + ' select';
						if ( mois != aDt['m'] ) classe = classe + ' diff';	
						g.append('<td id="'+ aDt['numJ'] + '-' + aDt['date'] +'" class="'+ classe +'">' + aDt['j'] + '</td>');
					}
					dt.setDate( aDt['j'] + 1 );
					aDt = $.calendrier.dateArray( dt );
				}
				e.append(g);
			} while( aDt['m'] == mois );	
			return cd;
		};
		/*
		 * @name action
		 * @desc associe les evenements aux nouveaux elements
		 * return void
		 */
		function action(){
			if ( param.choix == CAL_CHOIX_UNIQUE )
				$("td.jour", jEl).click(function(){
					$("td.jour", jEl).removeClass('select');
					$(this).addClass('select');
					if ( param.action_valide != null )
						param.action_valide(jEl, $(this).attr('id').split('-')[1] );
					return false;
				});
			else if ( param.choix == CAL_CHOIX_MULTIPLE ){
				$("td.jour", jEl).click(function(){
					var date =  $(this).attr('id').split('-')[1];
					if ( param.listeDate.indexOf(date) != -1 ){
						$(this).removeClass('select');
						param.listeDate = param.listeDate.replace(date+'|', '');
					}
					else{
						$(this).addClass('select');	
						param.listeDate = param.listeDate + date+'|';
					}
					return false;
				});
				
				$("th", jEl).css('cursor', 'pointer').click(function(){
					$("td[@id^="+ $(this).attr('id').substr(8, 1) +"-]",  $(this).parent().parent()).click();
					return false;
				});
			}
			
			$("span[@name='fermer']", jEl).click(function(){
				if ( param.action_fermer != null ) param.action_fermer(jEl );
				return false;
			});
			
			$("span[@name='valider']", jEl).click(function(){
				if ( param.action_valide != null )
					param.action_valide(jEl, param.listeDate.substr(0, param.listeDate.length-1) );
				return false;
			});
			
			$(".cdAnnee span", jEl).click(function(){
				$(".cdAnnee span", jEl).index($(this)[0]) == 0 ? param.annee-- : param.annee++;
				if ( param.type == CAL_TYPE_JOUR_DOUBLE)
					ajouterCadreJourDouble();	
				else if ( param.type == CAL_TYPE_JOUR_SIMPLE)
					ajouterCadreJourSimple();
				return false;
			});
			$(".cadreMois .titreMois div", jEl).click(function(){
				$(this).attr('class') == 'gauche'? param.mois-- : param.mois++;
				if ( param.mois == 0 ) { param.mois = 12; param.annee--; }
				else if ( param.mois == 13 ) { param.mois = 1; param.annee++; }
				if ( param.type == CAL_TYPE_JOUR_DOUBLE)
					ajouterCadreJourDouble();	
				else if ( param.type == CAL_TYPE_JOUR_SIMPLE)
					ajouterCadreJourSimple();	
				return false;
			});
		};

	};	
	/*
	 * @name $.calendrier.nbJourMois
	 * @desc retourne le nombre de jour dans un mois
	 * return int
	 */
	$.calendrier.nbJourMois = function(mois, annee){
		var numjour = 28;
		var dt = new Date(annee, mois-1, numjour);
		while( numjour == dt.getDate() ){
			numjour ++;
			dt.setDate(numjour);
		}
		return numjour - 1;
	};
	/*
	 * @name $.calendrier.dateArray
	 * @desc retourne les details d'une date dans un array
	 *       le paramètre d'entré peut etre un objet Date, un string au format aaammjj
	 * @return array
	 */
	$.calendrier.dateArray  = function(date){
		var retour = new Array();
		if ( date.length == 8 ){
			//date = new Date(parseInt(date.substr(0,4)), parseInt(date.substr(4,2)) - 1, parseInt(date.substr(6,2)));
			date = new Date(date.substr(0,4), date.substr(4,2) - 1, date.substr(6,2));
		}
		
		else if ( date == '' )
			date = new Date();
		retour['j'] = date.getDate();
		retour['J'] = retour['j'] <= 9 ? '0'+ retour['j'] : retour['j'];
		retour['numJ'] = date.getDay();
		retour['m'] = date.getMonth() + 1;
		retour['M'] = retour['m'] <= 9 ? '0'+ retour['m'] : retour['m'];
		retour['a'] = date.getFullYear();
		retour['date'] = retour['a'] +''+  retour['M'] +''+ retour['J'];
		return retour;
	};
	/*
	 * @name $.calendrier.dateFr
	 * @desc retourne une date au format vendredi 25 mai 2009
	 * @return sctring
	 */
	$.calendrier.dateFr  = function(date){
		var j = date.substr(6, 2) <= "09" ? date.substr(7, 1) : date.substr(6, 2);
		var m = date.substr(4, 2) <= "09" ? date.substr(5, 1) : date.substr(4, 2);
		var a = date.substr(0, 4);
		var d = new Date( a, m - 1, j );
		return TAB_JOUR[d.getDay()] +' '+ j +' '+ TAB_MOIS[m] +' '+ a;
	};
	
	$.fn.calendrier = function(param) {
		return this.each(function() {
			new $.calendrier( $(this), param);	
		});
	};

})(jQuery)