var myCalendar = Class.create();
myCalendar.prototype = {
	initialize: function(inputField, inputFieldFormat, specialDays, calendarOptions, doDisabled, disallowDays, lowlightedNumDays, lowlightedDays){
   		this.inputField = inputField;
   		this.inputFieldFormat = inputFieldFormat;
   		this.specialDays = specialDays;

   		this.calendarOptions = calendarOptions || {};
   		this.calendarOptions.inputField = this.calendarOptions.inputField || this.inputField;
   		this.calendarOptions.ifFormat = this.calendarOptions.ifFormat || this.inputFieldFormat;
   		this.calendarOptions.button = this.calendarOptions.button || 'trigger_' + this.inputField;
   		this.calendarOptions.dateStatusFunc = this.calendarOptions.dateStatusFunc || this.ourDateStatusFunc.bind(this);
		this.calendarOptions.numberMonths = 2;
		this.calendarOptions.showsTime = false;
   		this.doDisabled = doDisabled;
   		this.disallowDays = disallowDays || {};
   		this.lowlightedNumDays = lowlightedNumDays || {};
   		this.lowlightedDays = lowlightedDays || {};

	},

	create: function() {
   		this.calendar = new Zapatec.Calendar.setup(this.calendarOptions);
	},

	dateIsSpecial: function(year, month, day) {
  		mon_objet_date = new Date(year, month, day);
  		//if (mon_objet_date.getDay() == 0) return true;

  		var tabDays=this.disallowDays;
  		for (var j in tabDays){
  			if(mon_objet_date.getDay()==tabDays[j]){
  				return true;
  			}
  		}

  		var y = this.specialDays[year];
  		if (!y) return false;
	    for (var i in y){
	    	if (i == month){
		    	var m = y[i];
		    	if(!m) return false;
		    	for (var j in m) if(m[j] == day) return true;
	    	}
	    }
	    return false;
	},

	dateIsFerie: function(year, month, day) {
		var TabFeries = new Array();

		// vérif dates de l'année déjà calculées
		if(!window.datesFeriers) {
			window.datesFeriers = new Array();
		}

		if(window.datesFeriers[year]) {
			TabFeries = window.datesFeriers[year];
		}
		else {
		    var JourAn = new Date(year, "00", "01");
		    var FeteTravail = new Date(year, "04", "01");
		    var Victoire1945 = new Date(year, "04", "08");
		    var FeteNationale = new Date(year,"06", "14");
		    var Assomption = new Date(year, "07", "15");
		    var Toussaint = new Date(year, "10", "01");
		    var Armistice = new Date(year, "10", "11");
		    var Noel = new Date(year, "11", "25");
		    //var SaintEtienne = new Date(year, "11", "26")

		    var G = year%19
		    var C = Math.floor(year/100)
		    var H = (C - Math.floor(C/4) - Math.floor((8*C+13)/25) + 19*G + 15)%30
		    var I = H - Math.floor(H/28)*(1 - Math.floor(H/28)*Math.floor(29/(H + 1))*Math.floor((21 - G)/11))
		    var J = (year*1 + Math.floor(year/4) + I + 2 - C + Math.floor(C/4))%7
		    var L = I - J
		    var MoisPaques = 3 + Math.floor((L + 40)/44)
		    var JourPaques = L + 28 - 31*Math.floor(MoisPaques/4)
		    var Paques = new Date(year, MoisPaques-1, JourPaques)
		    //var VendrediSaint = new Date(year, MoisPaques-1, JourPaques-2)
		    var LundiPaques = new Date(year, MoisPaques-1, JourPaques+1)
		    var Ascension = new Date(year, MoisPaques-1, JourPaques+39)
		    var Pentecote = new Date(year, MoisPaques-1, JourPaques+49)
		    //var LundiPentecote = new Date(year, MoisPaques-1, JourPaques+50)

		    //TabFeries = new Array(JourAn, Paques, LundiPaques, Victoire1945, Ascension, Pentecote, FeteNationale, Assomption, Toussaint, Armistice, Noel);
		    TabFeries = new Array(JourAn, Paques, LundiPaques, FeteTravail, Ascension, Pentecote, FeteNationale, Assomption, Toussaint, Armistice, Noel);
			window.datesFeriers[year] = TabFeries;
		}

	    for(var i=0, tabLength = TabFeries.length; i<tabLength; i++) {
	    	if(TabFeries[i].getTime() == new Date(year,month,day).getTime()) {
	    		return true;
	    	}
	    }

	    return false;

	},

	/*dateIsHightLighted: function(year, month, day) {
		mon_objet_date = new Date(year, month, day);
  		var tabDays=this.hightlightedNumDays;
  		for (var j in tabDays){
  			if(mon_objet_date.getDay()==tabDays[j]){
  				return true;
  			}
  		}

  		var y = this.hightlightedDays[year];
  		if (!y) return false;
	    for (var i in y){
	    	if (i == month){
		    	var m = y[i];
		    	if(!m) return false;
		    	for (var j in m) if(m[j] == day) return true;
	    	}
	    }
	    return false;
	},*/

	dateIsLowLighted: function(year, month, day) {
		mon_objet_date = new Date(year, month, day);
  		var tabDays=this.lowlightedNumDays;
  		for (var j in tabDays){
  			if(mon_objet_date.getDay()==tabDays[j]){
  				return true;
  			}
  		}

  		var y = this.lowlightedDays[year];
  		if (!y) return false;
	    for (var i in y){
	    	if (i == month){
		    	var m = y[i];
		    	if(!m) return false;
		    	for (var j in m) if(m[j] == day) return true;
	    	}
	    }
	    return false;
	},

	ourDateStatusFunc: function(date, y, m, d) {
	    mon_objet_date = new Date(y, m, d);
	    mon_objet_date.setHours(0);
	    mon_objet_date.setMinutes(0);
	    mon_objet_date.setSeconds(0);
	    mon_objet_date.setMilliseconds(0);
	    aujourdhui_date= new Date();
	  	aujourdhui_date.setHours(0);
	    aujourdhui_date.setMinutes(0);
	    aujourdhui_date.setSeconds(0);
	    aujourdhui_date.setMilliseconds(0);
	    if (this.doDisabled && mon_objet_date.getTime()<aujourdhui_date.getTime())
	      return 'calendrier_disabled'; //si anterieur a aujourd hui
	  	if (this.doDisabled && this.dateIsSpecial(y, m, d))
	      return 'calendrier_disabled';
	    if (this.doDisabled && this.dateIsFerie(y, m, d))
	      return 'calendrier_disabled';
	    if (this.dateIsLowLighted(y, m, d))
	      return 'calendrier_lowlighted';
	    else
	      return false; // other dates are enabled
	      // return true if you want to disable other dates
	},

	setSpecialDays: function(data, data2) {
		//alert(data.length);
		this.disallowDays = data2;
		this.specialDays = data;
	},

	/*setHightLightDays: function(data, data2) {
		//alert(data.length);
		this.hightlightedNumDays = data;
		this.hightlightedDays = data2;
	},*/

	setLowLightDays: function(data, data2) {
		//alert(data.length);
		this.lowlightedNumDays = data;
		this.lowlightedDays = data2;
	},

	setShowTime: function(boolShow){
		this.calendarOptions.showsTime = boolShow;
	}
};

