if(!Array.indexOf){  
	Array.prototype.indexOf = function(obj){  
		for(var i=0; i<this.length; i++){  
			if(this[i]==obj){  
				return i;  
			}  
		}  
		return -1;  
	 }  
} 

var CALENDAR = function () {
	var wrap, label, 
			//months = ["Janvier", "Fevrier", "March", "April", "May", "June", "July","August", "September", "October", "November", "December"];
			months = ["JANVIER", "FEVRIER", "MARS", "AVRIL", "MAI", "JUIN", "JUILLET","AOUT", "SEPTEMBRE", "OCTOBRE", "NOVEMBRE", "DECEMBRE"];

		function init(newWrap) {
			wrap  = $(newWrap || "#cal");
			label = wrap.find("#label");
				
			wrap.find("#prev").bind("click.calender", function () { switchMonth(false); });
			wrap.find("#next").bind("click.calender", function () { switchMonth(true); });
			label.bind("click.calendar", function () { switchMonth(null, new Date().getMonth(), new Date().getFullYear() ); });
		}
		
		function switchMonth(next, month, year) {
			$("#infoCalendar").html("");
			//var curr = label.text().trim().split(" "), calendar, tempYear = parseInt(curr[1], 10);
			var curr = $.trim(label.text()).split(" "), calendar, tempYear = parseInt(curr[1], 10);
			
			month = month || ((next) ? ((curr[0] === "DECEMBRE") ? 0 : months.indexOf(curr[0]) + 1) : ( (curr[0] === "JANVIER") ? 11 : months.indexOf(curr[0]) - 1) );
			year  = year  || ((next && month === 0) ? tempYear + 1 : (!next && month === 11) ? tempYear -1 : tempYear);
				
			//console.profile("createCal");
			calendar = createCal(year, month);
			//console.profileEnd("createCal");

			$("#cal-frame", wrap)
				.find(".curr")
					.removeClass("curr")
					.addClass("temp")
				.end()
				.prepend(calendar.calendar())
				.find(".temp")
					.fadeOut("slow", function () { $(this).remove(); });
			label.text(calendar.label);
		}
		
	
	function in_array (needle, haystack, argStrict) {
    // *     example 1: in_array('van', ['Kevin', 'van', 'Zonneveld']);
    // *     returns 1: true
    // *     example 2: in_array('vlado', {0: 'Kevin', vlado: 'van', 1: 'Zonneveld'});
    // *     returns 2: false
    // *     example 3: in_array(1, ['1', '2', '3']);
    // *     returns 3: true
    // *     example 3: in_array(1, ['1', '2', '3'], false);
    // *     returns 3: true
    // *     example 4: in_array(1, ['1', '2', '3'], true);
    // *     returns 4: false
    var key = '',
        strict = !! argStrict;

    if (strict) {
        for (key in haystack) {
            if (haystack[key] === needle) {
                return true;
            }
        }
    } else {
        for (key in haystack) {
            if (haystack[key] == needle) {
                return true;
            }
        }
    }

    return false;
}
	
	
	function createCal(year, month) {
		var day = 1, i, j, haveDays = true, 
				//startDay = new Date(year, month, day).getDay(), // american calendar
				startDay = new Date(year, month, day-1).getDay(),  // french calendar
				daysInMonth = [31, (((year%4===0)&&(year%100!==0))||(year%400===0)) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ],
				calendar = [];
		if (createCal.cache[year]) {
			if (createCal.cache[year][month]) {
				return createCal.cache[year][month];
			}
		} else {
			createCal.cache[year] = {};
		}
		i = 0;
		while(haveDays) {
			calendar[i] = [];
			for (j = 0; j < 7; j++) {
				if (i === 0) {
					if (j === startDay) {
						calendar[i][j] = day++;
						startDay++;
					}
				} else if ( day <= daysInMonth[month]) {
					calendar[i][j] = day++;
				} else {
					calendar[i][j] = "";
					haveDays = false;
				}
				if (day > daysInMonth[month]) {
					haveDays = false;
				}
			}
			i++;
		}	
		
		/*
		if (calendar[5]) {
			for (i = 0; i < calendar[5].length; i++) {
				if (calendar[5][i] !== "") {
					calendar[4][i] = "<span>" + calendar[4][i] + "</span><span>" + calendar[5][i] + "</span>";
				}
			}
			calendar = calendar.slice(0, 5);
		}
		*/
		
		for (i = 0; i < calendar.length; i++) {
			calendar[i] = "<tr><td>" + calendar[i].join("</td><td>") + "</td></tr>";
		}

		calendar = $("<table>" + calendar.join("") + "</table").addClass("curr");

		$("td:empty", calendar).addClass("nil");
		
		
		eventDaysString=$.ajax({
		  url: "geteventdays.php",
		  global: false,
		  type: "POST",
		  data: ({currentmonth : month, currentyear : year}),
		  async:false
		}).responseText;
		
		var eventDays = new Array();
		eventDays = eventDaysString.split(',');
		$('td', calendar).filter(function () { return in_array($(this).text(),eventDays) && $(this).text()!="" }).addClass("event");
		
		if (month === new Date().getMonth()) {
			//$('td', calendar).filter(function () { return $(this).text() === new Date().getDate().toString(); }).addClass("today");
			$('td', calendar).filter(function () { 
				if($(this).text() === new Date().getDate().toString()){
					$(this).addClass("eventClicked");
					var day = $(this).text();
					$.ajax({
					  url: "getevents.php",
					  type: "POST",
					  data: ({currentday : day, currentmonth : month, currentyear : year, init : 1}),
					  success : function(msg){
							$("#infoCalendar").html(msg);
					  }
					});
				}
			});
		}
		
		createCal.cache[year][month] = { calendar : function () { return calendar.clone(); }, label : months[month] + " " + year };
		return createCal.cache[year][month];
	}
	createCal.cache = {};

	return {
		init : init,
		switchMonth : switchMonth,
		createCal : createCal
	};

};

