ArchiveFilters = function (instance_name) {
	this.calendarSlideSpeed = 300;
	this.datepickerFromOver = false;
	this.datepickerUntilOver = false;

	this.globalMinDate = new Date("08/01/2009");
	this.globalMaxDate = new Date();
	
	this.instance_name = instance_name;
	
	this.last_num_checked_channels = 0;
	this.total_num_channels = 0;
	
	this.currentDateRange = {};
	
	this.submittingKeys = [8,13,46,96,97,98,99,100,101,102,103,104,105];
	
	
	this.initHandlers = function (archive_instance) {
		var form = $('#' + this.instance_name + 'Form');
		
		
		$(form).find('[name=archiveSearch]').clearableTextField();
		
		$(form).find('[name=archiveSearch]').keyup(function (event) {
			archive_instance.load();
		});
		
		$(form).find('[name=archiveSearch]').change(function (event) {
			archive_instance.load();
		});
		
		
		$(form).find(".dateInputFrom input").keyup(function (event) {
			var instance = window[instance_name];
			var rangeValid = instance.dateRangeChangeHandler();
			
			if ((instance.submittingKeys.indexOf(event.keyCode) > -1) && rangeValid) {
				archive_instance.load();
			}
		});
		
		$(form).find(".dateInputUntil input").keyup(function (event) {
			var instance = window[instance_name];
			var rangeValid = instance.dateRangeChangeHandler();
			
			if ((instance.submittingKeys.indexOf(event.keyCode) > -1) && rangeValid) {
				archive_instance.load();
			}
		});
		
		this.initPickers();
		
		
		this.last_num_checked_channels = $(form).find('[name=channel_selection]:checked').length;
		this.total_num_channels = $(form).find('[name=channel_selection]').length;
		
		
		$(form).find('[name=channel_selection]').click($.proxy(function (event) {
			this.channelFilterChangeHandler(event.currentTarget);
		}, this));
		
		$(form).find('.archiveChannelFilterContainerTable td a').click($.proxy(function (event) {
			event.preventDefault();
			event.stopPropagation();
			event.stopImmediatePropagation();
			
			var input = $('#' + instance_name + 'channel' + $(event.currentTarget).attr('_channelId'));
			
			input.attr('checked', !input.attr('checked'));
			
			this.channelFilterChangeHandler(input);
			
			return false;
		}, this));
	};
	
	
	
	
	this.channelFilterChangeHandler = function(contextInputSelector) {
		var form = $('#' + instance_name + 'Form');
		
		var num_checked = $(form).find('[name=channel_selection]:checked').length;
		
		if (num_checked==0) {
			$(form).find('[name=channel_selection]').attr('checked', true);
		} else {
			if ((window[instance_name].last_num_checked_channels == window[instance_name].total_num_channels) && (num_checked == (window[instance_name].total_num_channels-1))) {
				$(form).find('[name=channel_selection]').not(contextInputSelector).attr('checked', false);
				$(contextInputSelector).attr('checked', true);
			}
		}
		
		window[instance_name].last_num_checked_channels = num_checked;
		window['archive'].load();
	};
	
	
	
	
	this.getFiltersData = function () {
		this.dateRangeChangeHandler();
		
		var out = {};
		
		var form = $('#' + this.instance_name + 'Form');
		
		var searchVal = $(form).find('[name=archiveSearch]').val();
		
		if (searchVal && (searchVal !== "")) {
			out.searchField = searchVal;
		}
		
		if (this.currentDateRange.from || this.currentDateRange.until) {
			out.timeStart = this.currentDateRange.from.getTime() / 1000;
			out.timeEnd = this.currentDateRange.until.getTime() / 1000;
		}
		
		var checkedChannels = new Array;
		
		$(form).find('[name=channel_selection]:checked').each(function () {
			checkedChannels.push($(this).val());
		});
		
		if (checkedChannels.length < $(form).find('[name=channel_selection]').length) {
			out.channelFilter = checkedChannels.join(',');
		}
		
		
		return out;
	};
	
	
	this.dateRangeChangeHandler = function (force_load) {
		var validationResult = this.validateDateRange();
		
		if (validationResult.dateRangeValid) {
			if (validationResult.fromDate && validationResult.untilDate) {
				this.currentDateRange = {
					from: validationResult.fromDate,
					until: validationResult.untilDate
				};
			} else {
				this.currentDateRange = {};
			}
		}
		
		if (force_load) {
			window['archive'].load();
		}
		
		return validationResult.bothDatesValid;
	};
	
	
	this.validateDateRange = function() {
		var form = $('#' + this.instance_name + 'Form');
		
		var fromDateValid = false;
		var untilDateValid = false;

		var fromDateEmpty = ($('#dateFromDay').attr('value') + $('#dateFromMonth').attr('value') + $('#dateFromYear').attr('value')) == "";
		var untilDateEmpty = ($('#dateUntilDay').attr('value') + $('#dateUntilMonth').attr('value') + $('#dateUntilYear').attr('value')) == "";
		
		if (fromDateEmpty && untilDateEmpty) {
			$(form).find(".dateInputFrom input").removeClass("error");
			$(form).find(".dateInputUntil input").removeClass("error");
			
			return {dateRangeValid: true, bothDatesValid: true};
		}
		

		var fromDate;
		var untilDate;

		if (fromDateEmpty) {
			fromDateValid = true;
			fromDate = this.globalMinDate;
		} else {
			fromDateValid = DateUtils.checkDate($('#dateFromDay').attr('value'), $('#dateFromMonth').attr('value'), $('#dateFromYear').attr('value'));
		}

		if (untilDateEmpty) {
			untilDateValid = true;
			untilDate = this.globalMaxDate;
		} else {
			untilDateValid = DateUtils.checkDate($('#dateUntilDay').attr('value'), $('#dateUntilMonth').attr('value'), $('#dateUntilYear').attr('value'));
		}


		if (fromDateValid) {
			$(form).find(".dateInputFrom input").removeClass("error");
		} else {
			var fromDate = this.globalMinDate;
			$(form).find(".dateInputFrom input").addClass("error");
		}
		
		if (untilDateValid) {
			$(form).find(".dateInputUntil input").removeClass("error");
		} else {
			var untilDate = this.globalMaxDate;
			$(form).find(".dateInputUntil input").addClass("error");
		}

		
		if (fromDateValid || untilDateValid) {
			if (!fromDate) {
				var fromDate = new Date($('#dateFromMonth').attr('value') + "/" + $('#dateFromDay').attr('value') + "/" + $('#dateFromYear').attr('value'));
			}
			if (!untilDate) {
				var untilDate = new Date($('#dateUntilMonth').attr('value') + "/" + $('#dateUntilDay').attr('value') + "/" + $('#dateUntilYear').attr('value'));
			}

			if (fromDate.getTime() >= untilDate.getTime()) {
				
				$(form).find(".dateInputFrom input").addClass("error");
				$(form).find(".dateInputUntil input").addClass("error");

				return {dateRangeValid: false};
			}
			
			return {dateRangeValid: true, fromDate: fromDate, untilDate: untilDate, bothDatesValid: (fromDateValid && untilDateValid)};
		}

		return {dateRangeValid: false};
	};
	
	
	
	
	this.initPickers = function() {
		var options = {
			dayNames: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],
			dayNamesMin: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
			dayNamesShort: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
			firstDay: 1,
			monthNames: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],
			monthNamesShort: ['Jan', 'Feb', 'Mrz', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
			dateFormat: "mm/dd/yy"
		};

		var fromEvents = {
			onSelect: this.dateFromSelectHandler
		};

		var untilEvents = {
			onSelect: this.dateUntilSelectHandler
		};
		
		$("#datepickerFrom").datepicker($.extend(options, fromEvents));
		$("#datepickerUntil").datepicker($.extend(options, untilEvents));

		$("#datepickerFrom, #datepickerUntil").each(function() {
			$(this).removeClass('invisible');
			$(this).slideUp(0);
		});

		$("#datepickerFrom").mouseenter(function() {
			window[instance_name].datepickerFromOver = true;
		});
		$("#datepickerFrom").mouseleave(function() {
			window[instance_name].datepickerFromOver = false;
		});
		$("#datepickerUntil").mouseenter(function() {
			window[instance_name].datepickerUntilOver = true;
		});
		$("#datepickerUntil").mouseleave(function() {
			window[instance_name].datepickerUntilOver = false;
		});

		$(document).click(function () {
			if (!window[instance_name].datepickerFromOver) {
				$("#datepickerFrom").slideUp(window[instance_name].calendarSlideSpeed);
			}
			if (!window[instance_name].datepickerUntilOver) {
				$("#datepickerUntil").slideUp(window[instance_name].calendarSlideSpeed);
			}
		});

		$(".dateInputUntil a").click(function(event) {
			$("#datepickerUntil").slideToggle(window[instance_name].calendarSlideSpeed);
			$("#datepickerFrom").slideUp(window[instance_name].calendarSlideSpeed);
			
			event.stopPropagation();
			event.stopImmediatePropagation();
		});
		$(".dateInputFrom a").click(function(event) {
			$("#datepickerFrom").slideToggle(window[instance_name].calendarSlideSpeed);
			$("#datepickerUntil").slideUp(window[instance_name].calendarSlideSpeed);
			
			event.stopPropagation();
			event.stopImmediatePropagation();
		});
	};
	
	
	
	this.dateFromSelectHandler = function (text, picker) {
		var parts = text.split('/');
		$('#dateFromDay').attr('value', parts[1]);
		$('#dateFromMonth').attr('value', parts[0]);
		$('#dateFromYear').attr('value', parts[2]);
		
		window[instance_name].dateRangeChangeHandler(true);
	};
	this.dateUntilSelectHandler = function (text, picker) {
		var parts = text.split('/');
		$('#dateUntilDay').attr('value', parts[1]);
		$('#dateUntilMonth').attr('value', parts[0]);
		$('#dateUntilYear').attr('value', parts[2]);

		window[instance_name].dateRangeChangeHandler(true);
	};
	
};
