docs: function ($input, opts) {
  			var tp_inst = new Timepicker(),
  				inlineSettings = {},
  				fns = {},
  				overrides, i;
  
  			for (var attrName in this._defaults) {
  				if (this._defaults.hasOwnProperty(attrName)) {
  					var attrValue = $input.attr('time:' + attrName);
  					if (attrValue) {
  						try {
  							inlineSettings[attrName] = eval(attrValue);
  						} catch (err) {
  							inlineSettings[attrName] = attrValue;
  						}
  					}
  				}
  			}
  
  			overrides = {
  				beforeShow: function (input, dp_inst) {
  					if ($.isFunction(tp_inst._defaults.evnts.beforeShow)) {
  						return tp_inst._defaults.evnts.beforeShow.call($input[0], input, dp_inst, tp_inst);
  					}
  				},
  				onChangeMonthYear: function (year, month, dp_inst) {
  					// Update the time as well : this prevents the time from disappearing from the $input field.
  					// tp_inst._updateDateTime(dp_inst);
  					if ($.isFunction(tp_inst._defaults.evnts.onChangeMonthYear)) {
  						tp_inst._defaults.evnts.onChangeMonthYear.call($input[0], year, month, dp_inst, tp_inst);
  					}
  				},
  				onClose: function (dateText, dp_inst) {
  					if (tp_inst.timeDefined === true && $input.val() !== '') {
  						tp_inst._updateDateTime(dp_inst);
  					}
  					if ($.isFunction(tp_inst._defaults.evnts.onClose)) {
  						tp_inst._defaults.evnts.onClose.call($input[0], dateText, dp_inst, tp_inst);
  					}
  				}
  			};
  			for (i in overrides) {
  				if (overrides.hasOwnProperty(i)) {
  					fns[i] = opts[i] || this._defaults[i] || null;
  				}
  			}
  
  			tp_inst._defaults = $.extend({}, this._defaults, inlineSettings, opts, overrides, {
  				evnts: fns,
  				timepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker');
  			});
  			tp_inst.amNames = $.map(tp_inst._defaults.amNames, function (val) {
  				return val.toUpperCase();
  			});
  			tp_inst.pmNames = $.map(tp_inst._defaults.pmNames, function (val) {
  				return val.toUpperCase();
  			});
  
  			// detect which units are supported
  			tp_inst.support = detectSupport(
  					tp_inst._defaults.timeFormat + 
  					(tp_inst._defaults.pickerTimeFormat ? tp_inst._defaults.pickerTimeFormat : '') +
  					(tp_inst._defaults.altTimeFormat ? tp_inst._defaults.altTimeFormat : ''));
  
  			// controlType is string - key to our this._controls
  			if (typeof(tp_inst._defaults.controlType) === 'string') {
  				if (tp_inst._defaults.controlType === 'slider' && typeof($.ui.slider) === 'undefined') {
  					tp_inst._defaults.controlType = 'select';
  				}
  				tp_inst.control = tp_inst._controls[tp_inst._defaults.controlType];
  			}
  			// controlType is an object and must implement create, options, value methods
  			else {
  				tp_inst.control = tp_inst._defaults.controlType;
  			}
  
  			// prep the timezone options
  			var timezoneList = [-720, -660, -600, -570, -540, -480, -420, -360, -300, -270, -240, -210, -180, -120, -60,
  					0, 60, 120, 180, 210, 240, 270, 300, 330, 345, 360, 390, 420, 480, 525, 540, 570, 600, 630, 660, 690, 720, 765, 780, 840];
  			if (tp_inst._defaults.timezoneList !== null) {
  				timezoneList = tp_inst._defaults.timezoneList;
  			}
  			var tzl = timezoneList.length, tzi = 0, tzv = null;
  			if (tzl > 0 && typeof timezoneList[0] !== 'object') {
  				for (; tzi < tzl; tzi++) {
  					tzv = timezoneList[tzi];
  					timezoneList[tzi] = { value: tzv, label: $.timepicker.timezoneOffsetString(tzv, tp_inst.support.iso8601) };
  				}
  			}
  			tp_inst._defaults.timezoneList = timezoneList;
  
  			// set the default units
  			tp_inst.timezone = tp_inst._defaults.timezone !== null ? $.timepicker.timezoneOffsetNumber(tp_inst._defaults.timezone) :
  							((new Date()).getTimezoneOffset() * -1);
  			tp_inst.hour = tp_inst._defaults.hour < tp_inst._defaults.hourMin ? tp_inst._defaults.hourMin :
  							tp_inst._defaults.hour > tp_inst._defaults.hourMax ? tp_inst._defaults.hourMax : tp_inst._defaults.hour;
  			tp_inst.minute = tp_inst._defaults.minute < tp_inst._defaults.minuteMin ? tp_inst._defaults.minuteMin :
  							tp_inst._defaults.minute > tp_inst._defaults.minuteMax ? tp_inst._defaults.minuteMax : tp_inst._defaults.minute;
  			tp_inst.second = tp_inst._defaults.second < tp_inst._defaults.secondMin ? tp_inst._defaults.secondMin :
  							tp_inst._defaults.second > tp_inst._defaults.secondMax ? tp_inst._defaults.secondMax : tp_inst._defaults.second;
  			tp_inst.millisec = tp_inst._defaults.millisec < tp_inst._defaults.millisecMin ? tp_inst._defaults.millisecMin :
  							tp_inst._defaults.millisec > tp_inst._defaults.millisecMax ? tp_inst._defaults.millisecMax : tp_inst._defaults.millisec;
  			tp_inst.microsec = tp_inst._defaults.microsec < tp_inst._defaults.microsecMin ? tp_inst._defaults.microsecMin :
  							tp_inst._defaults.microsec > tp_inst._defaults.microsecMax ? tp_inst._defaults.microsecMax : tp_inst._defaults.microsec;
  			tp_inst.ampm = '';
  			tp_inst.$input = $input;
  
  			if (tp_inst._defaults.altField) {
  				tp_inst.$altInput = $(tp_inst._defaults.altField);
  				if (tp_inst._defaults.altRedirectFocus === true) {
  					tp_inst.$altInput.css({
  						cursor: 'pointer'
  					}).focus(function () {
  						$input.trigger("focus");
  					});
  				}
  			}
  
  			if (tp_inst._defaults.minDate === 0 || tp_inst._defaults.minDateTime === 0) {
  				tp_inst._defaults.minDate = new Date();
  			}
  			if (tp_inst._defaults.maxDate === 0 || tp_inst._defaults.maxDateTime === 0) {
  				tp_inst._defaults.maxDate = new Date();
  			}
  
  			// datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime..
  			if (tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date) {
  				tp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime());
  			}
  			if (tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date) {
  				tp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime());
  			}
  			if (tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date) {
  				tp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime());
  			}
  			if (tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date) {
  				tp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime());
  			}
  			tp_inst.$input.bind('focus', function () {
  				tp_inst._onFocus();
  			});
  
  			return tp_inst;
  		}