(function($) {

$.widget("ui.datetime", {

	_init: function() {

		id = this.element.attr('id');

		// Handle UI
		this.element.hide();
		date = $('<input type="text" id="' + id + '_date" />').insertBefore(this.element).datepicker(this.options);
		time = $('<input type="text" id="' + id + '_time" />').insertAfter(this.element).timeEntry(this.options);
		date.after(' &nbsp; ');

		// Save pointers
		date.data('datetime', this);
		time.data('datetime', this);
		this.date = date;
		this.time = time;

		// Bind change events
		date.bind('change', this._changedValues);
		time.bind('change', this._changedValues);

		this._refreshValue();
	},

	destroy: function() {

		this.element.show();
		this.date.remove();
		this.time.remove();

		$.widget.prototype.destroy.apply(this, arguments);

	},

	value: function(newValue) {
		arguments.length && this._setData("value", newValue);
		return this._value();
	},

	_setData: function(key, value) {
		switch (key) {
			case 'value':
				this.element.val(value);
				this._refreshValue();
				this._trigger('change', null, {});
				break;
		}
		$.widget.prototype._setData.apply(this, arguments);
	},

	_value: function() {

		return this.element.val();

	},

	/* _date and/or _time widgets changed values. Update datetime */
	_changedValues: function () {
		datetime = $(this).data('datetime');

		date = datetime.date;
		time = datetime.time;

		d = date.datepicker('getDate');
		t = time.timeEntry('getTime');

		if (d && t) {
			dt = new Date(d.getFullYear(), d.getMonth(), d.getDate(),
				t.getHours(), t.getMinutes(), t.getSeconds());
			datetime.element.val(Math.round(dt.getTime()/1000.0));
		} else {
			datetime.element.val('');
		}
	},

	_refreshValue: function() {
		date = this.date;
		time = this.time;

		if (this.element.val()) {
			dt = new Date();
			dt.setTime(parseInt(this.element.val()) * 1000);

			d = new Date(dt.getFullYear(), dt.getMonth(), dt.getDate(), 0, 0, 0);
			t = new Date(0, 0, 0, dt.getHours(), dt.getMinutes(), dt.getSeconds());

			date.datepicker('setDate', d);
			time.timeEntry('setTime', t);
		} else {
			date.val('');
			time.val('');
		}
	}

});

$.extend($.ui.datetime, {
	version: "1.0",
	getter: "value",
	defaults: {
		spinnerImage: "",
		show24Hours: true
	}
});

})(jQuery);

