(function($){ $.fn.simpleDatePicker = function(opts) { if (opts && opts.command == 'toggle') { this.get(0).simpleDatePicker.toggle(); return this; } var defaults = {selected: null, minimumDate: null, maximumDate: null}; var months = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'); var abbreviations = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'); var daySelector = 'td:not(.m):not(:empty)'; defaults.format = function(date) { return months[date.getMonth()] + ' ' + date.getDate() + ' ' + date.getFullYear(); }; return this.each(function() { if (this.simpleDatePicker) { return false; } var options = $.extend({}, defaults, opts); var $input = $(this); var $container = null; var currentDate = new Date(); var mode = null; var self = { initialize: function() { $input.click(function (event) {self.show(); return false;}).keydown(function(e){ if (e.keyCode == 13) { self.entered(); return false; }}); $(document).keydown(function(e) { if (e.keyCode == 27) { self.hide(); }}).click(self.hide); $container = self.initializeContainer().hide() .append(self.buildMonth(new Date())) .delegate(daySelector, 'click', self.clicked) .delegate('td:not(:empty)', 'hover', self.hover) .delegate('.prev', 'click', self.loadPrevious) .delegate('.next', 'click', self.loadNext) .delegate('.month', 'click', self.pickMonth) .delegate('.year', 'click', self.pickYear) .click(function(){return false;}); }, parseDate: function(value) { return new Date(value); }, toggle: function() { $container.is(':visible') ? self.hide() : self.show(); }, show: function() { $container.show(); }, hide: function() { $container.hide(); }, loadPrevious: function() { $container.empty().append(self.buildMonth(new Date(currentDate.getFullYear(), currentDate.getMonth()-1, 1))); }, loadNext: function() { $container.empty().append(self.buildMonth(new Date(currentDate.getFullYear(), currentDate.getMonth()+1, 1))); }, hover: function() { $(this).toggleClass('hover'); }, clicked: function() { var $cell = $(this); if (mode == 'month') { $container.empty().append(self.buildMonth(new Date(currentDate.getFullYear(), (4*($cell.parent().index()-1)) + $cell.index(), 1))); } else if (mode == 'year') { currentDate = new Date($cell.text(), 0, 1); self.pickMonth(); } else { $container.find('td.selected').removeClass('selected'); $cell.addClass('selected'); var date = new Date(currentDate.getFullYear(), currentDate.getMonth(), $cell.text()); $input.val(self.format(date)).change(); if (options.selected != null) { options.selected(date, $cell); } self.hide(); } }, entered: function() { var date = self.parseDate($input.val().replace(/^\s*|\s*$/g, '')); var isValidDate = (new Date(date)).valueOf().toString() !== "NaN"; if (date == null || !isValidDate) { return; } $container.empty().append(self.buildMonth(date)).find(daySelector).eq(date.getDate()-1).click(); }, initializeContainer: function() { return $('