/*
 * jQuery Datepicker plugin
 */
; (function ($, $win) {
	'use strict';

	var DateMatcher = {
		getMatch: function (source, date) {
			var result = [true, ''];
			var self = this;

			$.each(source, function (key, value) {
				var parsedDate = self.parseDate(key);

				if (parsedDate.valueOf() === date.valueOf()) {
					result = [!value.disabled, value.class || 'active'];
				}
			});

			return result;
		},

		parseDate: function (dateStr) {
			var dateArr = dateStr.split('/');
			return new Date(parseInt(dateArr[2], 10), parseInt(dateArr[1], 10) - 1, parseInt(dateArr[0], 10));
		}
	};

	var Datepicker = {
		initSimple: function ($el, options) {
			$.Deferred(function (defer) {
				if (options.source) {
					$.getJSON(options.source)
						.done(defer.resolve)
						.fail(defer.reject);
				} else defer.resolve();
			}).then(function (source) {
				if (source) {
					options.beforeShowDay = function (date) {
						return DateMatcher.getMatch(source, date);
					};
				}

				$el.datepicker($.extend({
					dateFormat: 'd/mm/yy'
				}, options));
			});
		},
		initRange: function ($el, options) {
			var $inputFrom = $el.find('[data-datepicker-from]');
			var $inputTo = $el.find('[data-datepicker-to]');

			this.initSimple($inputFrom, $.extend({}, options, $inputFrom.data('datepickerFrom'), {
				defaultDate: 0,
				onClose: function (selectedDate) {
					$inputTo.datepicker('option', 'minDate', selectedDate);
				}
			}));

			this.initSimple($inputTo, $.extend({}, options, $inputTo.data('datepickerTo'), {
				defaultDate: 1,
				onClose: function (selectedDate) {
					$inputFrom.datepicker('option', 'maxDate', selectedDate);
				}
			}));
		}
	};

	$.fn.uiDatepicker = function (opt) {
		return this.each(function () {
			var $el = $(this);
			var data = $.extend(true, opt || {}, $el.data('datepicker') || {});
			var method = 'init' + (data.rangepicker ? 'Range' : 'Simple');

			Datepicker[method]($el, data);
		});
	};
}(jQuery, jQuery(window)));
