(function($){
	var old = $.fn.datepicker;
	jQuery.fn.extend({
		datepicker: function(newopts) {
			this.each(function() {
				var $this = $(this);
				if ($this.data("datepickerinit")) {
					return;
				}
				$this.data("datepickerinit", true);
				var obj = $this.ParseClass(),
				opts = {
					nextText: "&gt;",
					prevText: "&lt;",
					showAnim: 'blind',
					onSelect: function(dateText, inst) {
						$this.trigger("dpOnSelect", {dateText:dateText,inst:inst});
					}
				};
				$.extend(opts, newopts, obj)
				
				if (opts.readonly === true) {
					$this.attr("readonly", true);
				}
				
				old.call($this, opts);
			});
			return this;
		}
	});
	var old_generateHTML = $.datepicker._generateHTML;
	$.datepicker._generateHTML = function(inst) {
		var ret = '';
		if (inst.settings.prepend) {
			ret += unescape(inst.settings.prepend);
		}
		ret += old_generateHTML.call(this, inst);
		if (inst.settings.append) {
			ret += unescape(inst.settings.append);
		}
		return ret;
	}
	$.datepicker.dpDiv.bind("click", function(e) {
		if($(e.target).is("a.close")) {
			$.datepicker._hideDatepicker();
		}
	});
	$.datepicker.init = function(sel) {
		$(sel || "input.date").each(function() {
			var opts = {},
			$this = $(this);
			if ($this.hasClass("newservice")) {
				var obj = $this.ParseClass(),
				specDates = obj.specDates,
				onCloseFunction = function(dt, inst) {
					var ele = (obj.before != true) ? ($this.next().hasClass("validationIcon") ? $this.next() : $this) : $this;
					(obj.before == true ? $this.parents("div.item:first") : ele)[(obj.before == true) ? "prev" : "next"]().filter("p.error").detach();
					var d = new Date(dt),
					msg = '',
					now = new Date();
					now.setDate(now.getDate()-1);
					if (d < now) {
						//date in past
						ele[(obj.before == true) ? "before" : "after"]('<p class="error">' + $.datepicker.formatDate("m/d/yy", d) + ' ' + unescape(obj.pastDate) + '</p>');
						return;
					}
					if (d.getDay()%6 == 0) {
						//weekend
						ele[(obj.before == true) ? "before" : "after"]('<p class="error">' + $.datepicker.formatDate("m/d/yy", d) + ' ' + unescape(obj.weekendDate) + '</p>');
						return;
					}
					var y = d.getFullYear(),
					m = d.getMonth()+1,
					day = d.getDate();
					if (obj.connectFee) {
						$("span.connectFee").html(obj.connectFee);
					}
					for (var key in specDates) {
						var s = key.split("-");
						if (s[0] == y && s[1] == m && s[2] == day) {
							if (specDates[key] == "disabled") {
								//unselectable date
								(obj.before == true ? $this.parents("div.item:first") : ele)[(obj.before == true) ? "before" : "after"]('<p class="error">' + $.datepicker.formatDate("m/d/yy", d) + ' ' + unescape(obj.disabledDate) + '</p>');
							} else if (specDates[key] == "priority") {
								//priority date
								(obj.before == true ? $this.parents("div.item:first") : ele)[(obj.before == true) ? "before" : "after"]('<p class="error">' + $.datepicker.formatDate("m/d/yy", d) + ' ' + unescape(obj.priorityDate) + '</p>');
								if (obj.priorityConnectFee) {
									$("span.connectFee").html(obj.priorityConnectFee);
								}
							}
							return;
						}
					}
					if (inst) {
						inst.dpDiv.removeClass('newservice');
					}
				},
				opts = {
					minDate: 0,
					maxDate: "+90d",
					hideIfNoPrevNext: true,
					beforeShowDay: function(d) {
						var now = new Date();
						now.setDate(now.getDate()-1);
						if (d < now) {
							return [0, 'ui-datepicker-past-date'];
						}
						if (d.getDay()%6 == 0) {
							return [0,''];
						}
						var y = d.getFullYear(),
						m = d.getMonth()+1,
						day = d.getDate();
						for (var key in specDates) {
							var s = key.split("-");
							if (s[0] == y && s[1] == m && s[2] == day) {
								if (specDates[key] == "disabled") {
									return [0, ''];
								}
								return [1,specDates[key]];
							}
						}
						return [1,''];
					},
					onClose: onCloseFunction,
					beforeShow: function(input, inst) {
						inst.dpDiv.addClass('newservice');
					},
					prepend: '<div class="header"><a href="javascript:void(0);" class="close">X</a></div>' + unescape(obj.prepend),
					append: unescape(obj.append),
					readonly: true
				};
			}
			if ($this.hasClass("noWeekends")) {
				opts.beforeShowDay = function(d) {
					if (d.getDay()%6 == 0) {
						return [0,''];
					}
					return [1,''];
				}
			}
			$this.datepicker(opts);
			if (onCloseFunction) {
				onCloseFunction.call($this[0], $this.val());
			}
		});
	};
	$(document).ready(function() {
		$.datepicker.init("input.date");
	});
})(jQuery);
