function sxfDatePicker (datePickerWrapper, buttonImage) {
	this.wrapper = datePickerWrapper;
	this.buttonImage = buttonImage;
	this.year = function() {
		return $(this.wrapper.find('select.years'));
	};
	this.month = function() {
		return $(this.wrapper.find('select.months'));
	};
	this.day = function() {
		return $(this.wrapper.find('select.days'));
	};
	this.dateInput = function() {
		return $(this.wrapper.find('input[type="hidden"]'));
	};
	this.minDate = function() {
	    var last = this.year().children('option:last').val();
	    var first = this.year().children('option:eq(1)').val();
	    var second = this.year().children('option:eq(2)').val();
	    var x = isNaN(parseInt(last)) ? 9999 : last;
	    var y = isNaN(parseInt(first)) ? 9999 : first;
	    var z = isNaN(parseInt(second)) ? 9999 : second;
	    var minYear = Math.min(x, y, z);

	    return new Date('1 Jan' + minYear);
	};
	this.maxDate = function() {
	    var last = this.year().children('option:last').val();
	    var first = this.year().children('option:eq(1)').val();
	    var second = this.year().children('option:eq(2)').val();
	    var x = isNaN(parseInt(last)) ? 0 : last;
	    var y = isNaN(parseInt(first)) ? 0 : first;
	    var z = isNaN(parseInt(second)) ? 0 : second;
	    var maxYear = Math.max(x, y, z);
	    return new Date('31 Dec' + maxYear);
	};
	this.dateValue = function() {
		var day = this.day().children('option:selected').val();
		var month = this.month().children('option:selected').val();
		var year = this.year().children('option:selected').val();
		
		if (day.length == 0 || month.length == 0 || year.length == 0){
			return new Date();
		}

		var date = new Date();
		date.setDate(day);
		date.setMonth(month - 1);
		date.setFullYear(year);
		return date;
	};
	this.initialize = function() {
	
		this.wrapper.append('<input type="hidden" />');
		this.dateInput().datepicker({
			onSelect: datePickerOnSelect,
			showOn: "button",
			buttonImage: this.buttonImage,
			buttonImageOnly: true,
			dateFormat: 'd/m/yy',
			minDate: this.minDate(),
			maxDate: this.maxDate(),
			changeMonth: true,
			changeYear: true
		});

		var datePicker = this;
		this.day().change(function() { datePickerOnChange(datePicker) });
		this.month().change(function() { datePickerOnChange(datePicker) });
		this.year().change(function() { datePickerOnChange(datePicker) });
		datePickerOnChange(datePicker);
		$('#ui-datepicker-div').hide();
		
	};
}

function datePickerOnSelect(text, control) {
	var datePicker = new sxfDatePicker($(this).parent());
	var dt = text.split('/');
	
	datePicker.day().val(dt[0]);
	datePicker.month().val(dt[1]);
	datePicker.year().val(dt[2]);
	
	var selectedDay = datePicker.day().children("option[value=" + dt[0] + "]").get(0);
	var dayIndex = datePicker.day().children("option").index(selectedDay);
	
	var selectedYear = datePicker.year().children("option[value=" + dt[2] + "]").get(0);
	var yearIndex = datePicker.year().children("option").index(selectedYear);
	
	var selectedMonth = datePicker.month().children("option[value=" + dt[1] + "]").get(0);
	var monthIndex = datePicker.month().children("option").index(selectedMonth);
	
	datePicker.day().selectmenu("value", dayIndex);
	datePicker.year().selectmenu("value", yearIndex);
	datePicker.month().selectmenu("value", monthIndex);
	
	datePicker.day().change();
	datePicker.month().change();
	datePicker.year().change();
}

function datePickerOnChange(sxfDatePicker) {
	sxfDatePicker.dateInput().datepicker("setDate", sxfDatePicker.dateValue());
}

$(document).ready(function() {
	
	$('.dateSelect, .dateSelectWrap').not('.nocalendar').each(function(key, element) {
		var datePicker = new sxfDatePicker($(element), "/_images/buttons/calendar.gif");
		datePicker.initialize();
	});
	
});
