var sw3_calendar;
var sw3_events = new Object;
var sw3_events_m = new Object;
var sw3_events_all = new Array();

(function() {
	var loader = new YAHOO.util.YUILoader({
		base: '/common/yui/build/',
		require: ["calendar"],
		loadOptional: false,
		combine: false,
		filter: "MIN",
		allowRollup: true,
		onSuccess: function() {
			YAHOO.util.Event.onContentReady('sw3_calendar', sw3.joincalendar.init_cal);
			YAHOO.util.Event.onContentReady('sw3_next_events', sw3.joincalendar.init_evt);
		}
	});

// Load the files using the insert() method.
	loader.insert();
})();

// sw3.joincalendar.build.rubs = {17:true};

sw3.cals_sort = function(a, b) {
	if (a.start.getTime() < b.start.getTime()) {
		return -1;
	} else if (a.start.getTime() > b.start.getTime()) {
		return 1;
	} else return 0;
}

sw3.cals_displayEvents = function (m, y) {
	var el_events = YAHOO.util.Dom.get('sw3_calendar_events');
	if (el_events) {
		var data = '';
		if (sw3_events_m[y] && sw3_events_m[y][m]) {
			sw3_events_m[y][m].sort(sw3.cals_sort);
			for (var i=0; i<sw3_events_m[y][m].length; i++) {
				var evt_m = sw3_events_m[y][m][i];
				var s = sw3.joincalendar.build.template_cal;
				s = s.replace(/\$id\$/gi, evt_m.rub);
				s = s.replace(/\$date\$/gi, sw3.Display_EventDate(evt_m.start, evt_m.end, evt_m.time));
				s = s.replace(/\$name\$/gi, sw3.htmlEncode(evt_m.name));
				s = s.replace(/\$link\$/gi, '/' + sw3.language + '/' + evt_m.rub + '/' + y + sw3.pad(m) + '.html');
				data += s;
			}
		}
		el_events.innerHTML = data;
	}
}

sw3.Display_EventDate = function(startDate, endDate, hasTime) {
	var d1 = sw3.formatDate(startDate, true);
	var d2 = sw3.formatDate(endDate, true);
	if (hasTime) {
		var t1 = sw3.formatTime(startDate);
		var t2 = sw3.formatTime(endDate);
		var result = d1 + ' ' + t1;
		if (d1 == d2) {
			if (t1 != t2) {
				result = result + ' - ' + t2;
			}
		} else {
			result = result + ' - ' + d2 + ' ' + t2;
		}
		return result;
	} else {
		if (d1 == d2) {
			return d1;
		} else {
			return d1 + ' - ' + d2;
		}
	}
}

sw3.Display_smallEventDate = function(startDate, endDate) {
	var d1 = sw3.pad(startDate.getDate());
	var d2 = sw3.pad(endDate.getDate());
	if (startDate.getMonth() != endDate.getMonth()) d2 += sw3lang.date_pos_sep + sw3.pad(endDate.getMonth()+1);
	if (d1 == d2) {
		return d1;
	} else {
		return d1 + '-' + d2;
	}
}

sw3.pad = function(s) {
	if (s < 10) {
		return '0' + s;
	} else {
		return s;
	}
}

sw3.formatDate = function(d, pad) {
	var dt = [0, d.getDate(), d.getMonth() + 1, d.getFullYear()];
	if (pad) return sw3.pad(dt[sw3lang.date_pos_day]) + sw3lang.date_pos_sep + sw3.pad(dt[sw3lang.date_pos_month]) + sw3lang.date_pos_sep + sw3.pad(dt[sw3lang.date_pos_year]);
	return dt[sw3lang.date_pos_day] + sw3lang.date_pos_sep + dt[sw3lang.date_pos_month] + sw3lang.date_pos_sep + dt[sw3lang.date_pos_year];
}

sw3.formatTime = function(d) {
	return sw3.pad(d.getHours()) + ':' + sw3.pad(d.getMinutes());
}

sw3.joincalendar = {
	build : {
		template_cal: '<a href="$link$" class="rub_$id$"><div class="date">$date$</div><div class="name">$name$</div></a>',
		template_evt: '<a href="$link$" class="rub_$id$ event" title="$title$"><span class="date">$date$</span> <span class="name">$name$</span></a>',
		offset: 7,
		rubs: false
	},
	
	init_evt : function() {
//if (console) console.log('start init_evt');
		var evt_successHandler = function(oData) {
			var regdate = /[- :]/;
			for (var rub in sw3.cal) {
				var sw3cal = sw3.cal[rub];
				for (var i=0; i<sw3cal.length; i++) {
					evt = sw3cal[i];
					evt.rub = rub;
					var d = evt.start.split(regdate);
					d = new Date(d[0], d[1] - 1, d[2], d[3], d[4], d[5]);
					evt.start = d;
					d = evt.end.split(regdate);
					d = new Date(d[0], d[1] - 1, d[2], d[3], d[4], d[5]);
					evt.end = d;
					sw3_events_all.push(evt);
				}
			}
			sw3_events_all.sort(sw3.cals_sort);
			var el_events = YAHOO.util.Dom.get('sw3_next_events');
			var m = 0;
			var y = 0;
			var data = '';
			var cnt = sw3.joincalendar.build.offset;
			var idx = 0;
			var today = new Date;
			today = today.getTime();
//if (console) console.log('today: ' + today);
			while (cnt > 0 && idx < sw3_events_all.length) {
				var evt = sw3_events_all[idx];
				var start = evt.start.getTime();
				var end = evt.end.getTime();
				if (!evt.time) end += 24*60*60*1000;
				if (today < start || (today >= start && today < end)) {
					if (evt.start.getMonth() != m || evt.start.getFullYear() != y) {
						m = evt.start.getMonth();
						y = evt.start.getFullYear();
						var s = '<div class="month">$month$ $year$</div>';
						s = s.replace(/\$month\$/gi, sw3lang.lib_month[m]);
						s = s.replace(/\$year\$/gi, y);
						data += s;
					}
					var s = sw3.joincalendar.build.template_evt;
					s = s.replace(/\$id\$/gi, evt.rub);
					s = s.replace(/\$date\$/gi, sw3.Display_smallEventDate(evt.start, evt.end));
					s = s.replace(/\$name\$/gi, sw3.htmlEncode(evt.name));
					s = s.replace(/\$title\$/gi, sw3.struct[evt.rub].name[sw3.language].replace('"', '\"'));
					s = s.replace(/\$link\$/gi, '/' + sw3.language + '/' + evt.rub + '/' + y + sw3.pad(m + 1) + '.html');
					data += s;
					cnt -= 1;
				}
				idx += 1;
			}
			el_events.innerHTML = data;
		}
		
		r = sw3.joincalendar.build.rubs;
		if (!r) {
			r = {};
			for (var id in sw3.struct) {
				if (sw3.struct[id].type == 3) {
					r[id] = true;
				}
			}
		}
		var aURLs = [];
		var legend = '';
		for (var id in r) {
			aURLs.push('/' + sw3.language + '/' + id + '/events.js');
			var n = sw3.struct[id].name[sw3.language];
			legend += '<div class="sw3_cal_legend rub_' + id + '">' + sw3.htmlEncode(sw3.struct[id].name[sw3.language]) + '</div>';
		}
		var el_legend = YAHOO.util.Dom.get('sw3_calendar_legend');
		if (el_legend) el_legend.innerHTML = legend;
		
		YAHOO.util.Get.script(aURLs, {onSuccess: evt_successHandler});
//if (console) console.log('end init_evt');
	},
	
	init_cal : function() {
//if (console) console.log('start init_cal');
		var renderCellWithEvent = function(workingDate, cell) {
			YAHOO.util.Dom.addClass(cell, 'hasevent');
			var y = workingDate.getFullYear();
			var m = 1 + workingDate.getMonth();
			var d = workingDate.getDate();
			for (var id in sw3_events[y][m][d]) {
				YAHOO.util.Dom.addClass(cell, 'rub_' + id);
			}
		}
		
		function checkDateRange(type, args, cal) {
			var pagedate = cal.cfg.getProperty("pagedate");
			var mindate = cal.cfg.getProperty("mindate");
			var maxdate = cal.cfg.getProperty("maxdate");
			if (YAHOO.widget.DateMath.before(pagedate, mindate)) {
				cal.cfg.setProperty("pagedate", mindate);
			}
			if (YAHOO.widget.DateMath.after(pagedate, maxdate)) {
				cal.cfg.setProperty("pagedate", maxdate);
			}
		 }
	 
		 function checkDateRangeUI(type, args, cal) {
			var pagedate = cal.cfg.getProperty("pagedate");
			var mindate = cal.cfg.getProperty("mindate");
			var maxdate = cal.cfg.getProperty("maxdate");
	
			var leftArrow = YAHOO.util.Dom.getElementsByClassName(cal.Style.CSS_NAV_LEFT, null, cal.oDomContainer)[0];
			var rightArrow = YAHOO.util.Dom.getElementsByClassName(cal.Style.CSS_NAV_RIGHT, null, cal.oDomContainer)[0];
			
			if (pagedate.getMonth() == mindate.getMonth() && pagedate.getFullYear() == mindate.getFullYear()) {
				YAHOO.util.Dom.setStyle(leftArrow, "visibility", "hidden");
			} else {
				YAHOO.util.Dom.setStyle(leftArrow, "visibility", "visible");
			}
			if (pagedate.getMonth() == maxdate.getMonth() && pagedate.getFullYear() == maxdate.getFullYear()) {
				YAHOO.util.Dom.setStyle(rightArrow, "visibility", "hidden");
			} else {
				YAHOO.util.Dom.setStyle(rightArrow, "visibility", "visible");
			}
		 }
	
		function changeMonthEvent(type, args, cal) {
			var pagedate = cal.cfg.getProperty("pagedate");
			sw3.cals_displayEvents(1 + pagedate.getMonth(), pagedate.getFullYear());
		}

		function selectDateEvent(type, args, obj) {
			var selected = args[0];
			var y = selected[0][0];
			var m = selected[0][1];
			var d = selected[0][2];
			if (sw3_events[y][m][d]) {
//if (console) console.log(d, m, y, sw3_events[y][m][d]);
			}
		};
				
		var cal_successHandler = function(oData) {
			
			function checkmin(y, m, d) {
				if ((y < min_y) || (y == min_y && m < min_m) || (y == min_y && m == min_m && d < min_d)) {
					min_y = y;
					min_m = m;
					min_d = d
				}
			}
			
			function checkmax(y, m, d) {
				if ((y > max_y) || (y == max_y && m > max_m) || (y == max_y && m == max_m && d > max_d)) {
					max_y = y;
					max_m = m;
					max_d = d
				}
			}
	
			var regdate = /[- :]/;
			var dates = '';
			var today = new Date;
			var min_y = today.getFullYear();
			var min_m = 1 + today.getMonth();
			var min_d = today.getDate();
			var max_y = today.getFullYear();
			var max_m = 1 + today.getMonth();
			var max_d = today.getDate();
			for (var rub in sw3.cal) {
				var sw3cal = sw3.cal[rub];
				for (var i=0; i<sw3cal.length; i++) {
					evt = sw3cal[i];
					evt.rub = rub;
//console.log(evt);
					if (sw3_calendar) {
						var start = evt.start.split(regdate);
						var start_y = start[0];
						var start_m = start[1]; start_m++; start_m--;
						var start_d = start[2];
						checkmin(start_y, start_m, start_d);
						checkmax(start_y, start_m, start_d);
						var end = evt.end.split(regdate);
						var end_y = end[0];
						var end_m = end[1];
						var end_d = end[2];
						checkmin(end_y, end_m, end_d);
						checkmax(end_y, end_m, end_d);
						
						var s = sw3.formatDate(new Date(start_y, start_m - 1, start_d));
						var e = sw3.formatDate(new Date(end_y, end_m - 1, end_d));
						if (dates != '') dates += ',';
						dates += s;
						if (s != e) dates += '-' + e;
//console.log('début', iy, im, 'fin', jy, jm);
						while (start_y < end_y || (start_y == end_y && start_m <= end_m)) {
							if (typeof sw3_events[start_y] == "undefined") sw3_events[start_y] = new Array();
							if (typeof sw3_events[start_y][start_m] == "undefined") sw3_events[start_y][start_m] = new Array();
							if (typeof sw3_events_m[start_y] == "undefined") sw3_events_m[start_y] = new Array();
							if (typeof sw3_events_m[start_y][start_m] == "undefined") sw3_events_m[start_y][start_m] = new Array();
							var evt_m = {
								rub: rub,
								start: new Date(start[0], start[1] - 1, start[2], start[3], start[4], start[5]),
								end: new Date(end[0], end[1] - 1, end[2], end[3], end[4], end[5]),
								time: evt.time,
								name: evt.name
							}
							sw3_events_m[start_y][start_m].push(evt_m);
							var start_max = (start_y==end_y && start_m==end_m ? end_d : 31);
							for (var d=start_d; d<=start_max; d++) {
								if (!sw3_events[start_y][start_m][d]) {
									sw3_events[start_y][start_m][d] = {};
								}
								sw3_events[start_y][start_m][d][rub] = true;
							}
							start_m++;
							if (start_m > 12) {
								start_m = 1;
								start_y++;
							}
							start_d = 1;
						}
					}
				}
			}
			sw3_calendar.addRenderer(dates, renderCellWithEvent);
			sw3_calendar.cfg.setProperty('mindate', sw3.formatDate(new Date(min_y, min_m - 1, min_d)));
			sw3_calendar.cfg.setProperty('maxdate', sw3.formatDate(new Date(max_y, max_m - 1, max_d)));
			sw3_calendar.beforeRenderEvent.subscribe(checkDateRange, sw3_calendar);
			sw3_calendar.renderEvent.subscribe(checkDateRangeUI, sw3_calendar);
			sw3_calendar.render();
			sw3_calendar.changePageEvent.subscribe(changeMonthEvent, sw3_calendar, true);
			sw3.cals_displayEvents(1 + today.getMonth(), today.getFullYear());
			sw3_calendar.selectEvent.subscribe(selectDateEvent, sw3_calendar, true); 
		};
	
		sw3_calendar = new YAHOO.widget.Calendar('sw3_calendar');
		sw3_calendar.cfg.setProperty('DATE_FIELD_DELIMITER', sw3lang.date_pos_sep);
		sw3_calendar.cfg.setProperty('MDY_DAY_POSITION', sw3lang.date_pos_day);
		sw3_calendar.cfg.setProperty('MDY_MONTH_POSITION', sw3lang.date_pos_month);
		sw3_calendar.cfg.setProperty('MDY_YEAR_POSITION', sw3lang.date_pos_year);
	
		sw3_calendar.cfg.setProperty('MONTHS_SHORT', sw3lang.lib_mon);
		sw3_calendar.cfg.setProperty('MONTHS_LONG', sw3lang.lib_month);
		sw3_calendar.cfg.setProperty('WEEKDAYS_1CHAR', sw3lang.lib_d);
		sw3_calendar.cfg.setProperty('WEEKDAYS_SHORT', sw3lang.lib_dd);
		sw3_calendar.cfg.setProperty('WEEKDAYS_MEDIUM', sw3lang.lib_ddd);
		sw3_calendar.cfg.setProperty('WEEKDAYS_LONG',  sw3lang.lib_day);
	
		sw3_calendar.renderCellDefault = function(workingDate, cell) {
			cell.innerHTML = this.buildDayLabel(workingDate);
		};
	
		sw3_calendar.render();
		
		r = sw3.joincalendar.build.rubs;
		if (!r) {
			r = {};
			for (var id in sw3.struct) {
				if (sw3.struct[id].type == 3) {
					r[id] = true;
				}
			}
		}
		var aURLs = [];
		var legend = '';
		for (var id in r) {
			aURLs.push('/' + sw3.language + '/' + id + '/events.js');
			var n = sw3.struct[id].name[sw3.language];
			legend += '<div class="sw3_cal_legend rub_' + id + '">' + sw3.htmlEncode(sw3.struct[id].name[sw3.language]) + '</div>';
		}
		var el_legend = YAHOO.util.Dom.get('sw3_calendar_legend');
		if (el_legend) el_legend.innerHTML = legend;
		
		YAHOO.util.Get.script(aURLs, {onSuccess: cal_successHandler});
//if (console) console.log('end init_cal');
	}
}

