var CustomFilter = {
	calendars: [],
	start_end: null,
	selected_dates: {'start': null, 'end': null},
	first_month: null,
	init: function() {
		this.calendars[0] = new Calendar('calendar1', 'CustomFilter.select_date');
		this.calendars[1] = new Calendar('calendar2', 'CustomFilter.select_date');
		this.calendars[2] = new Calendar('calendar3', 'CustomFilter.select_date');
		var v = this.get_value('start');
		if (v) {
		    this.selected_dates.start = [v.getFullYear(), v.getMonth()+1, v.getDate()];
		}
		v = this.get_value('end');
		if (v) {
		    this.selected_dates.end = [v.getFullYear(), v.getMonth()+1, v.getDate()];
		}
		$j('#calendarpopup').css('top', $j('#start_date').offset().top - 30);
		$j('#start_date').focus(function() { CustomFilter.cal_show('start'); });
		$j('#end_date').focus(function() { CustomFilter.cal_show('end'); });
		$j('#start_date').keyup(function() { CustomFilter.cal_show('start'); });
		$j('#end_date').keyup(function() { CustomFilter.cal_show('end'); });
	},
	select_date: function(y, m, d) {
		$j('#' + CustomFilter.start_end + '_date').val(m + '/' + d + '/' + y);
		CustomFilter.unhighlight_cal_date(this.start_end);
		CustomFilter.selected_dates[CustomFilter.start_end] = [y, m, d];
		CustomFilter.highlight_cal_date(this.start_end);
		var other = (this.start_end === 'start') ? 'end' : 'start';
		CustomFilter.highlight_cal_date(other);
	},
	highlight_cal_date: function(start_end) {
		var d = CustomFilter.selected_dates[start_end];
		if (!d) {
		    return;
		}
		$j('#calendar1' + d[0] + '-' + d[1] + '-' + d[2]).addClass(start_end + 'date');
		$j('#calendar2' + d[0] + '-' + d[1] + '-' + d[2]).addClass(start_end + 'date');
		$j('#calendar3' + d[0] + '-' + d[1] + '-' + d[2]).addClass(start_end + 'date');
	},
	unhighlight_cal_date: function(start_end) {
		var d = CustomFilter.selected_dates[start_end];
		if (!d) {
		    return;
		}
		$j('#calendar1' + d[0] + '-' + d[1] + '-' + d[2]).removeClass(start_end + 'date');
		$j('#calendar2' + d[0] + '-' + d[1] + '-' + d[2]).removeClass(start_end + 'date');
		$j('#calendar3' + d[0] + '-' + d[1] + '-' + d[2]).removeClass(start_end + 'date');
	},
	get_value: function(start_end) {
		var value = $j('#' + start_end + '_date').val();
		if (value.match(/^\d\d?\/\d\d?\/\d\d\d\d$/)) {
			var secs = Date.parse(value);
			if (isNaN(secs)) {
			    return null;
			}
			return new Date(secs);
		}
		return null;
	},
	cal_show: function(start_end) {
		this.start_end = start_end;
		$j('#calendarpopup').show();
		var other = (start_end === 'start') ? 'end' : 'start';
		$j('#calendarbox').addClass(start_end + 'date');
		$j('#calendarbox').removeClass(other + 'date');
		$j('#calendar-selector-' + other).removeClass('selected');
		var d = CustomFilter.get_value(start_end);
		$j('#start_date,#end_date').removeClass('placeholder');
		var inp = $j('#calendar-selector-' + start_end);
		var valid = d;
		if (d) {
			inp.removeClass('error').addClass('selected');
			if (CustomFilter.get_value(other)) {
				$j('#datesearch').removeAttr('disabled');
			}
		}
		else {
			inp.addClass('error').removeClass('selected');
			$j('#datesearch').attr('disabled', 'disabled');
			d = new Date();
		}
		if (valid) {
		    CustomFilter.select_date(d.getFullYear(), d.getMonth()+1, d.getDate());
		}
		CustomFilter.cal_set(d.getFullYear(), d.getMonth()+1);
		$j('#calhelp').html((start_end === 'start') ? ' start' : 'n end');
	},
	cal_set: function(year, month) { // 1-based month
		var key = year + '-' + month; // Keep track of drawn month so we don't have to redraw unless needed.
		if (this.first_month == key) {
		    return;
		}
		this.calendars[0].drawDate(month, year);
		if (month == 12) {
		    year += 1;
		    month = 1;
		} else {
		    month += 1;
		}
		this.calendars[1].drawDate(month, year);
		if (month == 12) {
		    year += 1;
		    month = 1;
		} else {
		    month += 1;
		}
		this.calendars[2].drawDate(month, year);
		this.cal_update();
	},
	cal_update: function() {
		this.first_month = this.calendars[0].currentMonth + '-' + this.calendars[0].currentYear;
		CustomFilter.cal_refresh_highlights();
	},
	cal_next: function() {
		this.calendars[0].drawNextMonth();
		this.calendars[1].drawNextMonth();
		this.calendars[2].drawNextMonth();
		this.cal_update();
	},
	cal_previous: function() {
		this.calendars[0].drawPreviousMonth();
		this.calendars[1].drawPreviousMonth();
		this.calendars[2].drawPreviousMonth();
		this.cal_update();
	},
	cal_refresh_highlights: function() {
		var d = new Date();
		$j('#calendar1' + d.getFullYear() + '-' + (d.getMonth()+1) + '-' + d.getDate()).addClass('today');
		$j('#calendar2' + d.getFullYear() + '-' + (d.getMonth()+1) + '-' + d.getDate()).addClass('today');
		$j('#calendar3' + d.getFullYear() + '-' + (d.getMonth()+1) + '-' + d.getDate()).addClass('today');

		CustomFilter.unhighlight_cal_date('start');
		CustomFilter.unhighlight_cal_date('end');
		CustomFilter.highlight_cal_date('start');
		CustomFilter.highlight_cal_date('end');
	},
	cal_close: function() {
		$j('#calendarpopup').hide();
		$j('#calendar-selector-start').removeClass('selected');
		$j('#calendar-selector-end').removeClass('selected');
	},
	set_dates: function(d1, d2) {
		CustomFilter.start_end = 'start';
		CustomFilter.select_date(d1.getFullYear(), d1.getMonth()+1, d1.getDate());
		CustomFilter.start_end = 'end';
		CustomFilter.select_date(d2.getFullYear(), d2.getMonth()+1, d2.getDate());
		CustomFilter.cal_refresh_highlights();
		CustomFilter.cal_close();
	},
	shortcut_30days: function() {
		var today = new Date();
		var year, month;
		if (today.getMonth() === 0) {
			year = today.getFullYear() - 1;
			month = 11;
		} else {
			year = today.getFullYear();
			month = today.getMonth() - 1;
		}
		CustomFilter.set_dates(new Date(year, month, today.getDate()), today);
	},
	shortcut_12months: function() {
		var today = new Date();
		CustomFilter.set_dates(new Date(today.getFullYear()-1, today.getMonth(), today.getDate()), today);
	},
	shortcut_year: function() {
		var today = new Date();
		CustomFilter.set_dates(new Date(today.getFullYear(), 0, 1), today);
	},
	jump_today: function() {
		var d = new Date();
		CustomFilter.cal_set(d.getFullYear(), d.getMonth()+1);
	},
	jump_start_date: function() {
		var d = CustomFilter.get_value('start');
		CustomFilter.cal_set(d.getFullYear(), d.getMonth()+1);
	},
	jump_end_date: function() {
		var d = CustomFilter.get_value('end');
		CustomFilter.cal_set(d.getFullYear(), d.getMonth()+1);
	}
};