jQuery.fn.calendarSelector = function ( userOptions ) {
	

	var defaultOptions = {
		swapFields: false,
		yearMinDiff: 50,
		yearMaxDiff: 1,
		monthNames: false
	};

	var options = jQuery.extend(defaultOptions, userOptions);
	jQuery(this).each(
		function () {
			var _this = this;
			$(this).hide();
			var selectors = null;
			var year = (new Date()).getYear();
			year = (year < 1900)? year + 1900 : year;
			var month = (new Date()).getMonth();
			var day = (new Date()).getDate();

			var html =	'<table class="calendar-selector">';
			html	+=		'<tr>';
			if (options.swapFields) {
				html	+=			'<td><select class="calendar-selector-month"><option value="1"></option></select></td>';
				html	+=			'<td><select class="calendar-selector-day"></select></td>';
			}
			else {
				html	+=			'<td><select class="calendar-selector-day"></select></td>';
				html	+=			'<td><select class="calendar-selector-month"><option value="1"></option></select></td>';
			}
			html	+=			'<td><select class="calendar-selector-year"></select></td>';
			html 	+=		'</tr>';
			html	+=	'</table>';

			selectors = jQuery(html);
			jQuery(selectors).insertAfter ( this ) ;

			var tmp = '';
			if (options.monthNames) {
				for (i = 1; i <= 12; i++ ) {
					if (i-1 == month) selected = ' selected';
					else selected = '';
					tmp += '<option value="'+i+'"' + selected + '>' + options.monthNames[i] + '</option>';
				}
			}
			else {
				for (i = 1; i <= 12; i++ ) {
					if (i-1 == month) selected = ' selected';
					else selected = '';
					tmp += '<option value="'+i+'"' + selected + '>' + i + '</option>';
				}
			}
			jQuery('.calendar-selector-month',selectors).html(tmp);

			var tmp = '';
			for (i = year - options.yearMinDiff; i <= year + options.yearMaxDiff; i++ ) {
				if (i == year) selected = ' selected';
				else selected = '';
				tmp += '<option value="'+i+'"' + selected + '>' + i + '</option>';
			}
			jQuery('.calendar-selector-year',selectors).html(tmp);

			$('select.calendar-selector-month', selectors).change(
				function () {
					var month = $(this).val();
					var day = $('.calendar-selector-day', selectors).val();
					var ar = new Array(12)
					ar[1] = 31;
					ar[2] = (year % 4 == 0 ) ? 29 : 28;
					ar[3] = 31;
					ar[4] = 30;
					ar[5] = 31;
					ar[6] = 30;
					ar[7] = 31;
					ar[8] = 31;
					ar[9] = 30;
					ar[10] = 31;
					ar[11] = 30;
					ar[12] = 31;
					var tmp = '';
					for (i = 1; i <= ar[month]; i++ ) {
						if (i == day) selected = ' selected';
						else selected = '';
						tmp += '<option value="'+i+'"' + selected + '>' + i + '</option>';
					}
					jQuery('.calendar-selector-day',selectors).html(tmp);
				}
			);


			$('select', selectors).change(
				function () {
					$(_this).val($('.calendar-selector-day', selectors).val() + '.' + $('.calendar-selector-month', selectors).val() + '.' + $('.calendar-selector-year', selectors).val());
				}
			)

			$('select.calendar-selector-month', selectors).change();

		}
	);

};