(function($) {	
	var newMethods = {
		handleSelected: function(type, args, obj){
			var selected = args[0];
			var selectedDate = obj._toDate(selected[0]);
			if(obj.isClicked){
				obj.current_object.val(
					(selectedDate.getMonth()+1)+"/"+
					selectedDate.getDate()+"/"+
					selectedDate.getFullYear()
				);
				obj.after_change();
				obj.hide();
				obj.after_display();
			}
		},
		updateCal: function(c){
			var thisDate = Date.parse($(this).val());
			if(thisDate){
				var textDate = (thisDate.getMonth()+1)+"/"+thisDate.getDate()+"/"+thisDate.getFullYear();
				c.isClicked = false;
				c.select(textDate);
				c.cfg.setProperty("pagedate", (thisDate.getMonth()+1)+"/"+thisDate.getFullYear()); 
				c.render();
				this.setDateClicks(c);
			}
		},
		setDateClicks: function(c){
			$("#auto_complete_cal .calcell").click(function(){
				c.isClicked = true;
				c.select(c.getSelectedDates());
			});
		},
		showBeforeHide: function(type, args, obj) {		 
			obj.after_display();
		}
	};
	
	$.each(newMethods, function(i) {
		$.fn[i] = this;
	});
	
	$.fn.dateSelectorAutocomplete = function(settings){
		var settings = $.extend({
			classes: ["small_calendar_view"],
			before_display: function(){
				// callback placeholder
			},
			after_display: function(){
				// callback placeholder
			},
			after_change: function(){
				// callback placeholder
			}
		}, settings);
		return this.each(function(){
			// define the functions needed for each calendar
			var $this = $(this);
			$this.settings = settings;
			if($this.parents(".date_select_wrapper").length < 1){
				// generate wrapping markup
				$this.wrap("<div class='date_select_wrapper' id='date_select_"+this.id+"'></div>");
				$this.wrapper = $("#date_select_"+this.id);
				$this.wrapper.append("<div id='cal_container_"+this.id+"'></div>");
			}
			if(!$.cal_auto_complete){
				// append an element for holding the autocomplete calendar
				$("body").append("<div id='auto_complete_cal'></div>")
				$.each(settings.classes, function(){
		          $("#auto_complete_cal").addClass(this);
		        });
				$("#auto_complete_cal").addClass("auto_complete_cal");
		
				$.cal_auto_complete = new YAHOO.widget.Calendar("auto_complete_cal", {close: true});
				$.cal_auto_complete.cfg.setProperty("locale_weekdays", "1char");
				$.cal_auto_complete.after_display = settings.after_display;
				$.cal_auto_complete.after_change = settings.after_change;
				$.cal_auto_complete.changePageEvent.subscribe(function(){$(this).setDateClicks($.cal_auto_complete);}, $.cal_auto_complete, $this);
				$.cal_auto_complete.selectEvent.subscribe($this.handleSelected, $.cal_auto_complete, $this);
				$.cal_auto_complete.beforeHideEvent.subscribe($this.showBeforeHide, $.cal_auto_complete, true);
				$.cal_auto_complete.render();
			}

			$this.keydown(function(e){
				$.cal_auto_complete.show();
				if(e.which == 9){
					$.cal_auto_complete.isClicked = true;
					$.cal_auto_complete.current_object = $this;
					$.cal_auto_complete.select($.cal_auto_complete.getSelectedDates());
				}
			}).keyup(function(e){
				$this.updateCal($.cal_auto_complete);
			}).keypress(function(e){
				if(e.which==13 || e.which==27){
					$.cal_auto_complete.isClicked = true;
					$.cal_auto_complete.current_object = $this;
					$.cal_auto_complete.select($.cal_auto_complete.getSelectedDates());
					return false; // to stop this event from submitting the form
				}
			});
			
			// remove the display of all other calendars
			$(this).click(function(){
				$.cal_auto_complete.current_object = $this;
				var thisDate = Date.parse($this.val())
				if(!thisDate){
			        thisDate = Date.today();
				}
				var textDate = (thisDate.getMonth()+1)+"/"+thisDate.getDate()+"/"+thisDate.getFullYear();					
		        $.cal_auto_complete.select(textDate);
				$.cal_auto_complete.cfg.setProperty(
					"pagedate", 
					(thisDate.getMonth()+1)+"/"+thisDate.getFullYear()
				);
				$.cal_auto_complete.render();
				$(this).setDateClicks($.cal_auto_complete);
				settings.before_display();
				$("#auto_complete_cal").css('position', "absolute");
				$("#auto_complete_cal").css('top', $this.offset().top);
				$("#auto_complete_cal").css('left', $this.offset().left+$this.width());
				$.cal_auto_complete.show();
			});
			$(this).setDateClicks($.cal_auto_complete);
			$.cal_auto_complete.hide();
		})
	};
	
})(jQuery);
