jQuery.fn.birthSelect = function(options){

	var index = 0;

	var today = new Date();

	var settings = jQuery.extend({
		field: "",
		index: false,
		year: "18,100"
	}, options);

	return this.each(function(){
		
		var format = settings.format.split("");
		
		var obj = $("<span></span>");
		for (var x in format)
		{
			obj.append( eval(format[x] + ".call()") );
		};
		
		$(obj)
			.children("[name*='month']")
				.bind("change", function(e){
				
					var q = (new Date( $(this).parent().children("[name*='year']").val(), this.value, 0 )).getDate();
					var s = $(this).parent().children("[name*='day']");
					
					// hide invalid days
					$(s).children("option")
							.show()
							.filter(":gt("+ (q - 1) +")")
								.hide()
							.end()
						.end()
					.end();
					
					// alter selected if greater than allowed days
					if (q < $(s).find(":selected").val()) {
						$(s).find(":nth-child("+ q +")").attr("selected", "selected").end().end();
					}
				})
				.trigger("change")
			.end()
			.children("[name*='year']")
				.bind("change", function(){
					$(this)
						.parent()
							.children("[name*='month']")
								.trigger("change")
							.end()
						.end()
					.end();
				})
			.end()
		.end();
		
		$(this).replaceWith(obj);
	});
	
	function m()
	{
		var n = settings.field + "month" + (settings.index !== false ? "["+ settings.index +"]" : "");
		return s(n, 1, 12, (today.getMonth() + 1));
	};
	
	function d()
	{
		var n = settings.field + "day" + (settings.index !== false ? "["+ settings.index +"]" : "");
		return s(n, 1, 31, today.getDate());
	};
	
	function y()
	{
		var opt = settings.year.split(",");
		var ys = today.getFullYear();
		var n = settings.field + "year" + (settings.index !== false ? "["+ settings.index +"]" : "");
		return s(n, (ys - parseInt(opt[1])), (ys - parseInt(opt[0])), ys);
	};
	
	function s(name, start, end, selected)
	{
		var r = "<select name='"+ name +"'>";
		for (var x = start; x <= end; x ++)
		{
			r += "<option value='"+ x +"' "+ (x == selected ? "selected" : "") +">" + x;
		};
		return r + "</select>";
	}
	
};