﻿function FillDateSelector(lists, outputs, options, initialValues) {
	var ddlYears = $('#' + lists.year);
	var ddlMonths = $('#' + lists.month);
	var ddlDays = $('#' + lists.day);

	var hfYear = $('#' + outputs.year);
	var hfMonth = $('#' + outputs.month);
	var hfDay = $('#' + outputs.day);

	var allowUnknownYear = false;
	var allowUnknownMonth = false;
	var allowUnknownDay = false;
	
	if(options != null) {
		allowUnknownYear = options["allowUnknownYear"];
		allowUnknownMonth = options["allowUnknownMonth"];
		allowUnknownDay = options["allowUnknownDay"];
	}
	
	var lastSelectedMonth = null;
	var lastSelectedDay = null;

	FillYears();
	FillMonths();
	FillDays();

	if(hfYear.val() != '') {
		ddlYears.val(hfYear.val());
	}

	if(hfMonth.val() != '') {
		ddlMonths.val(hfMonth.val());
	}
	
	if(hfDay.val() != '') {
		ddlDays.val(hfDay.val());
	}

	CheckYearStatus();

	UpdateOutput();

	ddlYears.change(function() {
		CheckYearStatus();
		UpdateOutput();
	});

	ddlMonths.change(function() {
		CheckMonthStatus();
		UpdateOutput();
	});

	ddlDays.change(function() {
		UpdateOutput();
	});

	function CheckYearStatus() {
		if(ddlYears.val() == '0') {
			DisableMonths();
			DisableDays();
		}
		else {
			EnableMonths();
			CheckMonthStatus();
		}
	}

	function CheckMonthStatus() {
		if(ddlMonths.val() == '0') {
			DisableDays();
		}
		else {
			EnableDays();
			UpdateDays();
		}
	}

	function UpdateOutput() {
		hfYear.val(ddlYears.val())
		hfMonth.val(ddlMonths.val())
		hfDay.val(ddlDays.val())
	}

	function UpdateDays() {
		if(ddlDays.attr('disabled') == 'disabled') {
			return;
		}
	
		var selected = ddlDays.val();

		FillDays();

		ddlDays.val(selected);
	}

	function DisableMonths() {
		if(ddlMonths.attr('disabled') == 'disabled') {
			return;
		}

		ddlMonths.attr('disabled', 'disabled');
		lastSelectedMonth = ddlMonths.val();
		ddlMonths.val('0');
	}

	function EnableMonths() {
		if(!ddlMonths.attr('disabled') == 'disabled') {
			return;
		}
		
		ddlMonths.removeAttr('disabled');

		if(lastSelectedMonth != null) {
			ddlMonths.val(lastSelectedMonth);
		}
	}

	function DisableDays() {
		if(ddlDays.attr('disabled') == 'disabled') {
			return;
		}

		ddlDays.attr('disabled', 'disabled');
		lastSelectedDay = ddlDays.val();
		ddlDays.val('0');
	}

	function EnableDays() {
		if(!ddlDays.attr('disabled') == 'disabled') {
			return;
		}

		ddlDays.removeAttr('disabled');

		if(lastSelectedDay != null) {
			ddlDays.val(lastSelectedDay);
		}
	}

	function FillYears() {
		var years = new Array();

		if(allowUnknownYear) {
			years['0'] = 'Unknown';
		}

		var currentYear = new Date().getFullYear();
		
		for (var i = currentYear - 5; i <= currentYear + 20; i++) {
			years[String(i)] = String(i);
		}

		FillList(ddlYears, years);
	}

	function FillMonths() {
		var months = {
			'0': 'Unknown',
			'1': 'January',
			'2': 'February',
			'3': 'March',
			'4': 'April',
			'5': 'May',
			'6': 'June',
			'7': 'July',
			'8': 'August',
			'9': 'September',
			'10': 'October',
			'11': 'November',
			'12': 'December'
		};

		if(!allowUnknownMonth) {
			delete months['0'];
		}

		FillList(ddlMonths, months);
	}

	function FillDays() {
		var selectedMonth = Number(ddlMonths.val());
		var selectedYear = Number(ddlYears.val());
		
		var maxDay;

		if(selectedMonth == 0) {
			maxDay = 31;
		}
		else if(selectedMonth == 2) {
			if(selectedYear == 0) {
				maxDay = 29;
			}
			else if((selectedYear % 4 == 0 && selectedYear % 100 != 0) || (selectedYear % 400 == 0)) {
				maxDay = 29;
			}
			else {
				maxDay = 28;
			}
		}
		else if(selectedMonth < 8) {
			maxDay = 30 + (selectedMonth % 2);
		}
		else {
			maxDay = 31 - (selectedMonth % 2);
		}

		var days = new Array();

		if(allowUnknownDay) {
			days['0'] = 'Unknown';
		}
		
		for(var i = 1; i <= maxDay; i++) {
			days[String(i)] = String(i);
		}

		FillList(ddlDays, days);
	}

	function FillList(list, values) {
		list.children().remove();
		
		$.each(values, function(val, text) {
			list.append(
				$("<option></option>").val(val).html(text)
			);
		});
	}
}
