text: /*****************************************************************************
   *  FILE:  anytime.js - The Any+Time(TM) JavaScript Library (source)
   *
   *  VERSION: 4.1112K
   *
   *  Copyright 2008-2011 Andrew M. Andrews III (www.AMA3.com). Some Rights 
   *  Reserved. This work licensed under the Creative Commons Attribution-
   *  Noncommercial-Share Alike 3.0 Unported License except in jurisdicitons
   *  for which the license has been ported by Creative Commons International,
   *  where the work is licensed under the applicable ported license instead.
   *  For a copy of the unported license, visit
   *  http://creativecommons.org/licenses/by-nc-sa/3.0/
   *  or send a letter to Creative Commons, 171 Second Street, Suite 300,
   *  San Francisco, California, 94105, USA.  For ported versions of the
   *  license, visit http://creativecommons.org/international/
   *
   *  Alternative licensing arrangements may be made by contacting the
   *  author at http://www.AMA3.com/contact/
   *
   *  The Any+Time(TM) JavaScript Library provides the following ECMAScript
   *  functionality:
   *
   *    AnyTime.Converter
   *      Converts Dates to/from Strings, allowing a wide range of formats
   *      closely matching those provided by the MySQL DATE_FORMAT() function,
   *      with some noteworthy enhancements.
   *
   *    AnyTime.pad()
   *      Pads a value with a specific number of leading zeroes.
   *      
   *    AnyTime.noPicker()
   *      Destroys a calendar widget previously added by AnyTime.picker().
   *      Can also be invoked via jQuery using $(selector).AnyTime_noPicker()
   *
   *    AnyTime.picker()
   *      Attaches a calendar widget to a text field for selecting date/time
   *      values with fewer mouse movements than most similar pickers.  Any
   *      format supported by AnyTime.Converter can be used for the text field.
   *      If JavaScript is disabled, the text field remains editable without
   *      any of the picker features.
   *      Can also be invoked via jQuery using $(selector).AnyTime_picker()
   *
   *  IMPORTANT NOTICE:  This code depends upon the jQuery JavaScript Library
   *  (www.jquery.com), currently version 1.4.
   *
   *  The Any+Time(TM) code and styles in anytime.css have been tested (but not
   *  extensively) on Windows Vista in Internet Explorer 8.0, Firefox 3.0, Opera
   *  10.10 and Safari 4.0.  Minor variations in IE6+7 are to be expected, due
   *  to their broken box model. Please report any other problems to the author
   *  (URL above).
   *
   *  Any+Time is a trademark of Andrew M. Andrews III.
   *  Thanks to Chu for help with a setMonth() issue!
   ****************************************************************************/
  
  var AnyTime =
  {
    	//=============================================================================
    	//  AnyTime.pad() pads a value with a specified number of zeroes and returns
    	//  a string containing the padded value.
    	//=============================================================================
  
    	pad: function( val, len )
    	{
    		var str = String(Math.abs(val));
    		while ( str.length < len )
    		str = '0'+str;
    		if ( val < 0 )
    		str = '-'+str;
    		return str;
    	}
  };
  
  (function($)
  {
  	// private members
  
  	var __oneDay = (24*60*60*1000);
  	var __daysIn = [ 31,28,31,30,31,30,31,31,30,31,30,31 ];
  	var __iframe = null;
  	var __initialized = false;
  	var __msie6 = ( navigator.userAgent.indexOf('MSIE 6') > 0 ); 
  	var __msie7 = ( navigator.userAgent.indexOf('MSIE 7') > 0 ); 
    	var __pickers = [];
  
    	//  Add methods to jQuery to create and destroy pickers using
    	//  the typical jQuery approach.
    	
    	jQuery.prototype.AnyTime_picker = function( options )
    	{
    		return this.each( function(i) { AnyTime.picker( this.id, options ); } );
    	}
    	
    	jQuery.prototype.AnyTime_noPicker = function()
    	{
    		return this.each( function(i) { AnyTime.noPicker( this.id ); } );
    	}
  
    	//  Add methods to jQuery to change the earliest and latest times using
    	//  the typical jQuery approach.
    	
    	jQuery.prototype.AnyTime_setEarliest = function( options )
      {
    		return this.each( function(i) { AnyTime.setEarliest( this.id, options ); } );
      }
    	
    	jQuery.prototype.AnyTime_setLatest = function( options )
      {
    		return this.each( function(i) { AnyTime.setLatest( this.id, options ); } );
      }
    	
    	//	Add special methods to jQuery to compute the height and width
  	//	of picker components differently for Internet Explorer 6.x
  	//  This prevents the pickers from being too tall and wide.
    	
    	jQuery.prototype.AnyTime_height = function(inclusive)
    	{
    		return ( __msie6 ?
    					Number(this.css('height').replace(/[^0-9]/g,'')) :
    					this.outerHeight(inclusive) );
    	};
  
    	jQuery.prototype.AnyTime_width = function(inclusive)
    	{
    		return ( __msie6 ?
    					(1+Number(this.css('width').replace(/[^0-9]/g,''))) :
    					this.outerWidth(inclusive) );
    	};
  
    	
    	// 	Add a method to jQuery to change the classes of an element to
    	//  indicate whether it's value is current (used by AnyTime.picker),
    	//  and another to trigger the click handler for the currently-
    	//  selected button under an element.
  
    	jQuery.prototype.AnyTime_current = function(isCurrent,isLegal)
  	{
  	    if ( isCurrent )
  	    {
  		  this.removeClass('AnyTime-out-btn ui-state-default ui-state-disabled ui-state-highlight');
  	      this.addClass('AnyTime-cur-btn ui-state-default ui-state-highlight');
  	    }
  	    else
  	    {
  	      this.removeClass('AnyTime-cur-btn ui-state-highlight');
  	      if ( ! isLegal )
  	    	  this.addClass('AnyTime-out-btn ui-state-disabled');
  	      else
  	    	  this.removeClass('AnyTime-out-btn ui-state-disabled');
  	    }
  	};
  	
  	jQuery.prototype.AnyTime_clickCurrent = function()
  	{
  		this.find('.AnyTime-cur-btn').triggerHandler('click');
  	}
    	
    	$(document).ready( 
    		function()
  		{
  			//  IE6 doesn't float popups over <select> elements unless an
  			//	<iframe> is inserted between them!  The <iframe> is added to
  			//	the page *before* the popups are moved, so they will appear
  			//  after the <iframe>.
  			
  			if ( __msie6 )
  			{
  				__iframe = $('<iframe frameborder="0" scrolling="no"></iframe>');
  				__iframe.src = "javascript:'<html></html>';";
  				$(__iframe).css( {
  					display: 'block',
  					height: '1px',
  					left: '0',
  					top: '0',
  					width: '1px',
  					zIndex: 0
  					} );
  				$(document.body).append(__iframe);
  			}
  			
  			//  Move popup windows to the end of the page.  This allows them to
  			//  overcome XHTML restrictions on <table> placement enforced by MSIE.
  			
  			for ( var id in __pickers )
          if ( ! Array.prototype[id] ) // prototype.js compatibility issue
  			    __pickers[id].onReady();
  			
  			__initialized = true;
  		
  		} ); // document.ready
    	
  //=============================================================================
  //  AnyTime.Converter
  //
  //  This object converts between Date objects and Strings.
  //
  //  To use AnyTime.Converter, simply create an instance for a format string,
  //  and then (repeatedly) invoke the format() and/or parse() methods to
  //  perform the conversions.  For example:
  //
  //    var converter = new AnyTime.Converter({format:'%Y-%m-%d'})
  //    var datetime = converter.parse('1967-07-30') // July 30, 1967 @ 00:00
  //    alert( converter.format(datetime) ); // outputs: 1967-07-30
  //
  //  Constructor parameter:
  //
  //  options - an object of optional parameters that override default behaviors.
  //    The supported options are:
  //
  //    baseYear - the number to add to two-digit years if the %y format
  //      specifier is used.  By default, AnyTime.Converter follows the
  //      MySQL assumption that two-digit years are in the range 1970 to 2069
  //      (see http://dev.mysql.com/doc/refman/5.1/en/y2k-issues.html).
  //      The most common alternatives for baseYear are 1900 and 2000.
  //
  //    dayAbbreviations - an array of seven strings, indexed 0-6, to be used
  //      as ABBREVIATED day names.  If not specified, the following are used:
  //      ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']
  //      Note that if the firstDOW option is passed to AnyTime.picker() (see
  //      AnyTime.picker()), this array should nonetheless begin with the 
  //      desired abbreviation for Sunday.
  //
  //    dayNames - an array of seven strings, indexed 0-6, to be used as
  //      day names.  If not specified, the following are used: ['Sunday',
  //        'Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']
  //      Note that if the firstDOW option is passed to AnyTime.picker() (see
  //      AnyTime.picker()), this array should nonetheless begin with the
  //      desired name for Sunday.
  //
  //    eraAbbreviations - an array of two strings, indexed 0-1, to be used
  //      as ABBREVIATED era names.  Item #0 is the abbreviation for "Before
  //      Common Era" (years before 0001, sometimes represented as negative
  //      years or "B.C"), while item #1 is the abbreviation for "Common Era"
  //      (years from 0001 to present, usually represented as unsigned years
  //      or years "A.D.").  If not specified, the following are used:
  //      ['BCE','CE']
  //
  //    format - a string specifying the pattern of strings involved in the
  //      conversion.  The parse() method can take a string in this format and
  //      convert it to a Date, and the format() method can take a Date object
  //      and convert it to a string matching the format.
  //
  //      Fields in the format string must match those for the DATE_FORMAT()
  //      function in MySQL, as defined here:
  //      http://tinyurl.com/bwd45#function_date-format
  //
  //      IMPORTANT:  Some MySQL specifiers are not supported (especially
  //      those involving day-of-the-year, week-of-the-year) or approximated.
  //      See the code for exact behavior.
  //
  //      In addition to the MySQL format specifiers, the following custom
  //      specifiers are also supported:
  //
  //        %B - If the year is before 0001, then the "Before Common Era"
  //          abbreviation (usually BCE or the obsolete BC) will go here.
  //
  //        %C - If the year is 0001 or later, then the "Common Era"
  //          abbreviation (usually CE or the obsolete AD) will go here.
  //
  //        %E - If the year is before 0001, then the "Before Common Era"
  //          abbreviation (usually BCE or the obsolete BC) will go here.
  //          Otherwise, the "Common Era" abbreviation (usually CE or the
  //          obsolete AD) will go here.
  //
  //        %Z - The current four-digit year, without any sign.  This is
  //          commonly used with years that might be before (or after) 0001,
  //          when the %E (or %B and %C) specifier is used instead of a sign.
  //          For example, 45 BCE is represented "0045".  By comparison, in
  //          the "%Y" format, 45 BCE is represented "-0045".
  //
  //        %z - The current year, without any sign, using only the necessary
  //          number of digits.  This if the year is commonly used with years
  //          that might be before (or after) 0001, when the %E (or %B and %C)
  //          specifier is used instead of a sign.  For example, the year
  //          45 BCE is represented as "45", and the year 312 CE as "312".
  //
  //        %# - the timezone offset, with a sign, in minutes.
  //
  //        %+ - the timezone offset, with a sign, in hours and minutes, in
  //          four-digit, 24-hour format with no delimiter (for example, +0530).
  //          To remember the difference between %+ and %-, it might be helpful
  //          to remember that %+ might have more characters than %-.
  //
  //        %: - the timezone offset, with a sign, in hours and minutes, in
  //          four-digit, 24-hour format with a colon delimiter (for example,
  //          +05:30).  This is similar to the %z format used by Java.  
  //          To remember the difference between %: and %;, it might be helpful
  //          to remember that a colon (:) has a period (.) on the bottom and
  //          a semicolon (;) has a comma (,), and in English sentence structure,
  //          a period represents a more significant stop than a comma, and
  //          %: might be a longer string than %; (I know it's a stretch, but
  //          it's easier than looking it up every time)!
  //  	
  //        %- - the timezone offset, with a sign, in hours and minutes, in
  //          three-or-four-digit, 24-hour format with no delimiter (for
  //          example, +530).
  //
  //        %; - the timezone offset, with a sign, in hours and minutes, in
  //          three-or-four-digit, 24-hour format with a colon delimiter
  //          (for example, +5:30).
  //
  //        %@ - the timezone offset label.  By default, this will be the
  //          string "UTC" followed by the offset, with a sign, in hours and  
  //          minutes, in four-digit, 24-hour format with a colon delimiter
  //          (for example, UTC+05:30).  However, if Any+Time(TM) has been
  //          extended with a member named utcLabel (for example, by the
  //          anytimetz.js file), then it is assumed to be an array of arrays,
  //          where the primary array is indexed by time zone offsets, and
  //          each sub-array contains a potential label for that offset.
  //          When parsing with %@, the array is scanned for matches to the
  //          input string, and if a match is found, the corresponding UTC
  //          offset is used.  When formatting, the array is scanned for a
  //          matching offset, and if one is found, the first member of the
  //          sub-array is used for output (unless overridden with
  //          utcFormatOffsetSubIndex or setUtcFormatOffsetSubIndex()).
  //          If the array does not exist, or does not contain a sub-array
  //          for the offset, then the default format is used.
  //
  //    monthAbbreviations - an array of twelve strings, indexed 0-6, to be
  //      used as ABBREVIATED month names.  If not specified, the following
  //      are used: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep',
  //        'Oct','Nov','Dec']
  //
  //    monthNames - an array of twelve strings, indexed 0-6, to be used as
  //      month names.  If not specified, the following are used:
  //      ['January','February','March','April','May','June','July',
  //        'August','September','October','November','December']
  //
  //    utcFormatOffsetAlleged - the offset from UTC, in minutes, to claim that
  //      a Date object represents during formatting, even though it is formatted
  //      using local time. Unlike utcFormatOffsetImposed, which actually
  //      converts the Date object to the specified different time zone, this
  //      option merely reports the alleged offset when a timezone specifier
  //      (%#, %+, %-, %:, %; %@) is encountered in the format string.
  //      This primarily exists so AnyTime.picker can edit the time as specified
  //      (without conversion to local time) and then convert the edited time to
  //      a different time zone (as selected using the picker).  Any initial
  //      value specified here can be changed by setUtcFormatOffsetAlleged().
  //      If a format offset is alleged, one cannot also be imposed (the imposed
  //      offset is ignored).
  //
  //    utcFormatOffsetImposed - the offset from UTC, in minutes, to specify when
  //      formatting a Date object.  By default, a Date is always formatted
  //      using the local time zone.
  //
  //    utcFormatOffsetSubIndex - when extending AnyTime with a utcLabel array
  //      (for example, by the anytimetz.js file), the specified sub-index is
  //      used to choose the Time Zone label for the UTC offset when formatting
  //      a Date object.  This primarily exists so AnyTime.picker can specify
  //      the label selected using the picker.  Any initial value specified here
  //      can be changed by setUtcFormatOffsetSubIndex().
  //
  //    utcParseOffsetAssumed - the offset from UTC, in minutes, to assume when
  //      parsing a String object.  By default, a Date is always parsed using the
  //      local time zone, unless the format string includes a timezone
  //      specifier (%#, %+, %-, %:, %; or %@), in which case the timezone
  //      specified in the string is used. The Date object created by parsing
  //      always represents local time regardless of the input time zone.
  //
  //    utcParseOffsetCapture - if true, any parsed string is always treated as
  //      though it represents local time, and any offset specified by the string
  //      (or utcParseOffsetAssume) is captured for return by the 
  //      getUtcParseOffsetCaptured() method.  If the %@ format specifier is
  //      used, the sub-index of any matched label is also captured for return
  //      by the getUtcParseOffsetSubIndex() method.  This primarily exists so
  //      AnyTime.picker can edit the time as specified (without conversion to
  //      local time) and then convert the edited time to a different time zone
  //      (as selected using the picker). 
  //=============================================================================
  
  AnyTime.Converter = function(options)
  {
    	// private members
  
    	var _flen = 0;
  	var _longDay = 9;
  	var _longMon = 9;
  	var _shortDay = 6;
  	var _shortMon = 3;
  	var _offAl = Number.MIN_VALUE; // format time zone offset alleged
  	var _offCap = Number.MIN_VALUE; // parsed time zone offset captured
  	var _offF = Number.MIN_VALUE; // format time zone offset imposed
  	var _offFSI = (-1); // format time zone label subindex
  	var _offP = Number.MIN_VALUE; // parsed time zone offset assumed
  	var _offPSI = (-1);        // parsed time zone label subindex captured
  	var _captureOffset = false;
  
  	// public members
    
  	this.fmt = '%Y-%m-%d %T';
  	this.dAbbr = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];
  	this.dNames = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
  	this.eAbbr = ['BCE','CE'];
  	this.mAbbr = [ 'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec' ];
  	this.mNames = [ 'January','February','March','April','May','June','July','August','September','October','November','December' ];
  	this.baseYear = null;
  	
  	//-------------------------------------------------------------------------
  	//  AnyTime.Converter.dAt() returns true if the character in str at pos
  	//  is a digit.
  	//-------------------------------------------------------------------------
  	
  	this.dAt = function( str, pos )
  	{
  	    return ( (str.charCodeAt(pos)>='0'.charCodeAt(0)) &&
  	            (str.charCodeAt(pos)<='9'.charCodeAt(0)) );
  	};
  	
  	//-------------------------------------------------------------------------
  	//  AnyTime.Converter.format() returns a String containing the value
  	//  of a specified Date object, using the format string passed to
  	//  AnyTime.Converter().
  	//
  	//  Method parameter:
  	//
  	//    date - the Date object to be converted
  	//-------------------------------------------------------------------------
  	
  	this.format = function( date )
  	{
  		var d = new Date(date.getTime());
  		if ( ( _offAl == Number.MIN_VALUE ) && ( _offF != Number.MIN_VALUE ) )
  		  d.setTime( ( d.getTime() + (d.getTimezoneOffset()*60000) ) + (_offF*60000) );
  			
  	    var t;
  	    var str = '';
  	    for ( var f = 0 ; f < _flen ; f++ )
  	    {
  	      if ( this.fmt.charAt(f) != '%' )
  	        str += this.fmt.charAt(f);
  	      else
  	      {
  	    	var ch = this.fmt.charAt(f+1)
  	        switch ( ch )
  	        {
  	          case 'a': // Abbreviated weekday name (Sun..Sat)
  	            str += this.dAbbr[ d.getDay() ];
  	            break;
  	          case 'B': // BCE string (eAbbr[0], usually BCE or BC, only if appropriate) (NON-MYSQL)
  	            if ( d.getFullYear() < 0 )
  	              str += this.eAbbr[0];
  	            break;
  	          case 'b': // Abbreviated month name (Jan..Dec)
  	            str += this.mAbbr[ d.getMonth() ];
  	            break;
  	          case 'C': // CE string (eAbbr[1], usually CE or AD, only if appropriate) (NON-MYSQL)
  	            if ( d.getFullYear() > 0 )
  	              str += this.eAbbr[1];
  	            break;
  	          case 'c': // Month, numeric (0..12)
  	            str += d.getMonth()+1;
  	            break;
  	          case 'd': // Day of the month, numeric (00..31)
  	            t = d.getDate();
  	            if ( t < 10 ) str += '0';
  	            str += String(t);
  	            break;
  	          case 'D': // Day of the month with English suffix (0th, 1st,...)
  	            t = String(d.getDate());
  	            str += t;
  	            if ( ( t.length == 2 ) && ( t.charAt(0) == '1' ) )
  	              str += 'th';
  	            else
  	            {
  	              switch ( t.charAt( t.length-1 ) )
  	              {
  	                case '1': str += 'st'; break;
  	                case '2': str += 'nd'; break;
  	                case '3': str += 'rd'; break;
  	                default: str += 'th'; break;
  	              }
  	            }
  	            break;
  	          case 'E': // era string (from eAbbr[], BCE, CE, BC or AD) (NON-MYSQL)
  	            str += this.eAbbr[ (d.getFullYear()<0) ? 0 : 1 ];
  	            break;
  	          case 'e': // Day of the month, numeric (0..31)
  	            str += d.getDate();
  	            break;
  	          case 'H': // Hour (00..23)
  	            t = d.getHours();
  	            if ( t < 10 ) str += '0';
  	            str += String(t);
  	            break;
  	          case 'h': // Hour (01..12)
  	          case 'I': // Hour (01..12)
  	            t = d.getHours() % 12;
  	            if ( t == 0 )
  	              str += '12';
  	            else
  	            {
  	              if ( t < 10 ) str += '0';
  	              str += String(t);
  	            }
  	            break;
  	          case 'i': // Minutes, numeric (00..59)
  	            t = d.getMinutes();
  	            if ( t < 10 ) str += '0';
  	            str += String(t);
  	            break;
  	          case 'k': // Hour (0..23)
  	            str += d.getHours();
  	            break;
  	          case 'l': // Hour (1..12)
  	            t = d.getHours() % 12;
  	            if ( t == 0 )
  	              str += '12';
  	            else
  	              str += String(t);
  	            break;
  	          case 'M': // Month name (January..December)
  	            str += this.mNames[ d.getMonth() ];
  	            break;
  	          case 'm': // Month, numeric (00..12)
  	            t = d.getMonth() + 1;
  	            if ( t < 10 ) str += '0';
  	            str += String(t);
  	            break;
  	          case 'p': // AM or PM
  	            str += ( ( d.getHours() < 12 ) ? 'AM' : 'PM' );
  	            break;
  	          case 'r': // Time, 12-hour (hh:mm:ss followed by AM or PM)
  	            t = d.getHours() % 12;
  	            if ( t == 0 )
  	              str += '12:';
  	            else
  	            {
  	              if ( t < 10 ) str += '0';
  	              str += String(t) + ':';
  	            }
  	            t = d.getMinutes();
  	            if ( t < 10 ) str += '0';
  	            str += String(t) + ':';
  	            t = d.getSeconds();
  	            if ( t < 10 ) str += '0';
  	            str += String(t);
  	            str += ( ( d.getHours() < 12 ) ? 'AM' : 'PM' );
  	            break;
  	          case 'S': // Seconds (00..59)
  	          case 's': // Seconds (00..59)
  	            t = d.getSeconds();
  	            if ( t < 10 ) str += '0';
  	            str += String(t);
  	            break;
  	          case 'T': // Time, 24-hour (hh:mm:ss)
  	            t = d.getHours();
  	            if ( t < 10 ) str += '0';
  	            str += String(t) + ':';
  	            t = d.getMinutes();
  	            if ( t < 10 ) str += '0';
  	            str += String(t) + ':';
  	            t = d.getSeconds();
  	            if ( t < 10 ) str += '0';
  	            str += String(t);
  	            break;
  	          case 'W': // Weekday name (Sunday..Saturday)
  	            str += this.dNames[ d.getDay() ];
  	            break;
  	          case 'w': // Day of the week (0=Sunday..6=Saturday)
  	            str += d.getDay();
  	            break;
  	          case 'Y': // Year, numeric, four digits (negative if before 0001)
  	            str += AnyTime.pad(d.getFullYear(),4);
  	            break;
  	          case 'y': // Year, numeric (two digits, negative if before 0001)
  	            t = d.getFullYear() % 100;
  	            str += AnyTime.pad(t,2);
  	            break;
  	          case 'Z': // Year, numeric, four digits, unsigned (NON-MYSQL)
  	            str += AnyTime.pad(Math.abs(d.getFullYear()),4);
  	            break;
  	          case 'z': // Year, numeric, variable length, unsigned (NON-MYSQL)
  	            str += Math.abs(d.getFullYear());
  	            break;
  	          case '%': // A literal '%' character
  	            str += '%';
  	            break;
  	          case '#': // signed timezone offset in minutes
  	        	t = ( _offAl != Number.MIN_VALUE ) ? _offAl :
  	        		( _offF == Number.MIN_VALUE ) ? (0-d.getTimezoneOffset()) : _offF;
  	        	if ( t >= 0 )
  	        		str += '+';
  	        	str += t;
  	        	break;
  	          case '@': // timezone offset label
  		        t = ( _offAl != Number.MIN_VALUE ) ? _offAl :
  		        	( _offF == Number.MIN_VALUE ) ? (0-d.getTimezoneOffset()) : _offF;
  		        if ( AnyTime.utcLabel && AnyTime.utcLabel[t] )
  		        {
  		          if ( ( _offFSI > 0 ) && ( _offFSI < AnyTime.utcLabel[t].length ) )
  		            str += AnyTime.utcLabel[t][_offFSI];
  		          else
  		            str += AnyTime.utcLabel[t][0];
  		          break;
  		        }
  		        str += 'UTC';
  		        ch = ':'; // drop through for offset formatting
  	          case '+': // signed, 4-digit timezone offset in hours and minutes
  	          case '-': // signed, 3-or-4-digit timezone offset in hours and minutes
  	          case ':': // signed 4-digit timezone offset with colon delimiter
  	          case ';': // signed 3-or-4-digit timezone offset with colon delimiter
  		        t = ( _offAl != Number.MIN_VALUE ) ? _offAl :
  		        		( _offF == Number.MIN_VALUE ) ? (0-d.getTimezoneOffset()) : _offF;
  		        if ( t < 0 )
  		          str += '-';
  		        else
  		          str += '+';
  		        t = Math.abs(t);
  		        str += ((ch=='+')||(ch==':')) ? AnyTime.pad(Math.floor(t/60),2) : Math.floor(t/60);
  		        if ( (ch==':') || (ch==';') )
  		          str += ':';
  		        str += AnyTime.pad(t%60,2);
  		        break;
  	          case 'f': // Microseconds (000000..999999)
  	          case 'j': // Day of year (001..366)
  	          case 'U': // Week (00..53), where Sunday is the first day of the week
  	          case 'u': // Week (00..53), where Monday is the first day of the week
  	          case 'V': // Week (01..53), where Sunday is the first day of the week; used with %X
  	          case 'v': // Week (01..53), where Monday is the first day of the week; used with %x
  	          case 'X': // Year for the week where Sunday is the first day of the week, numeric, four digits; used with %V
  	          case 'x': // Year for the week, where Monday is the first day of the week, numeric, four digits; used with %v
  	            throw '%'+ch+' not implemented by AnyTime.Converter';
  	          default: // for any character not listed above
  	            str += this.fmt.substr(f,2);
  	        } // switch ( this.fmt.charAt(f+1) )
  	        f++;
  	      } // else
  	    } // for ( var f = 0 ; f < _flen ; f++ )
  	    return str;
  	    
  	}; // AnyTime.Converter.format()
  		  
  	//-------------------------------------------------------------------------
  	//  AnyTime.Converter.getUtcParseOffsetCaptured() returns the UTC offset
  	//  last captured by a parsed string (or assumed by utcParseOffsetAssumed).
  	//  It returns Number.MIN_VALUE if this object was not constructed with
  	//  the utcParseOffsetCapture option set to true, or if an offset was not
  	//  specified by the last parsed string or utcParseOffsetAssumed.
  	//-------------------------------------------------------------------------
  	
  	this.getUtcParseOffsetCaptured = function()
  	{
  	    return _offCap;
  	};
  	
  	//-------------------------------------------------------------------------
  	//  AnyTime.Converter.getUtcParseOffsetCaptured() returns the UTC offset
  	//  last captured by a parsed string (or assumed by utcParseOffsetAssumed).
  	//  It returns Number.MIN_VALUE if this object was not constructed with
  	//  the utcParseOffsetCapture option set to true, or if an offset was not
  	//  specified by the last parsed string or utcParseOffsetAssumed.
  	//-------------------------------------------------------------------------
  	
  	this.getUtcParseOffsetSubIndex = function()
  	{
  	    return _offPSI;
  	};
  	
  	//-------------------------------------------------------------------------
  	//  AnyTime.Converter.parse() returns a Date initialized from a specified
  	//  string, using the format passed to AnyTime.Converter().
  	//
  	//  Method parameter:
  	//
  	//    str - the String object to be converted
  	//-------------------------------------------------------------------------
  	
  	this.parse = function( str )
  	{
  		_offCap = _offP;
  		_offPSI = (-1);
  	    var era = 1;
        var time = new Date(4,0,1,0,0,0,0);//4=leap year bug
  	    var slen = str.length;
  	    var s = 0;
  	    var tzSign = 1, tzOff = _offP;
  	    var i, matched, sub, sublen, temp;
  	    for ( var f = 0 ; f < _flen ; f++ )
  	    {
  	      if ( this.fmt.charAt(f) == '%' )
  	      {
  			var ch = this.fmt.charAt(f+1);
  	        switch ( ch )
  	        {
  	          case 'a': // Abbreviated weekday name (Sun..Sat)
  	            matched = false;
  	            for ( sublen = 0 ; s + sublen < slen ; sublen++ )
  	            {
  	              sub = str.substr(s,sublen);
  	              for ( i = 0 ; i < 12 ; i++ )
  	                if ( this.dAbbr[i] == sub )
  	                {
  	                  matched = true;
  	                  s += sublen;
  	                  break;
  	                }
  	              if ( matched )
  	                break;
  	            } // for ( sublen ... )
  	            if ( ! matched )
  	              throw 'unknown weekday: '+str.substr(s);
  	            break;
  	          case 'B': // BCE string (eAbbr[0]), only if needed. (NON-MYSQL)
  	            sublen = this.eAbbr[0].length;
  	            if ( ( s + sublen <= slen ) && ( str.substr(s,sublen) == this.eAbbr[0] ) )
  	            {
  	              era = (-1);
  	              s += sublen;
  	            }
  	            break;
  	          case 'b': // Abbreviated month name (Jan..Dec)
  	            matched = false;
  	            for ( sublen = 0 ; s + sublen < slen ; sublen++ )
  	            {
  	              sub = str.substr(s,sublen);
  	              for ( i = 0 ; i < 12 ; i++ )
  	                if ( this.mAbbr[i] == sub )
  	                {
  	                  time.setMonth( i );
  	                  matched = true;
  	                  s += sublen;
  	                  break;
  	                }
  	              if ( matched )
  	                break;
  	            } // for ( sublen ... )
  	            if ( ! matched )
  	              throw 'unknown month: '+str.substr(s);
  	            break;
  	          case 'C': // CE string (eAbbr[1]), only if needed. (NON-MYSQL)
  	            sublen = this.eAbbr[1].length;
  	            if ( ( s + sublen <= slen ) && ( str.substr(s,sublen) == this.eAbbr[1] ) )
  	              s += sublen; // note: CE is the default era
  	            break;
  	          case 'c': // Month, numeric (0..12)
  	            if ( ( s+1 < slen ) && this.dAt(str,s+1) )
  	            {
  	              time.setMonth( (Number(str.substr(s,2))-1)%12 );
  	              s += 2;
  	            }
  	            else
  	            {
  	              time.setMonth( (Number(str.substr(s,1))-1)%12 );
  	              s++;
  	            }
  	            break;
  	          case 'D': // Day of the month with English suffix (0th,1st,...)
  	            if ( ( s+1 < slen ) && this.dAt(str,s+1) )
  	            {
  	              time.setDate( Number(str.substr(s,2)) );
  	              s += 4;
  	            }
  	            else
  	            {
  	              time.setDate( Number(str.substr(s,1)) );
  	              s += 3;
  	            }
  	            break;
  	          case 'd': // Day of the month, numeric (00..31)
  	            time.setDate( Number(str.substr(s,2)) );
  	            s += 2;
  	            break;
  	          case 'E': // era string (from eAbbr[]) (NON-MYSQL)
  	            sublen = this.eAbbr[0].length;
  	            if ( ( s + sublen <= slen ) && ( str.substr(s,sublen) == this.eAbbr[0] ) )
  	            {
  	              era = (-1);
  	              s += sublen;
  	            }
  	            else if ( ( s + ( sublen = this.eAbbr[1].length ) <= slen ) && ( str.substr(s,sublen) == this.eAbbr[1] ) )
  	              s += sublen; // note: CE is the default era
  	            else
  	              throw 'unknown era: '+str.substr(s);
  	            break;
  	          case 'e': // Day of the month, numeric (0..31)
  	            if ( ( s+1 < slen ) && this.dAt(str,s+1) )
  	            {
  	              time.setDate( Number(str.substr(s,2)) );
  	              s += 2;
  	            }
  	            else
  	            {
  	              time.setDate( Number(str.substr(s,1)) );
  	              s++;
  	            }
  	            break;
  	          case 'f': // Microseconds (000000..999999)
  	            s += 6; // SKIPPED!
  	            break;
  	          case 'H': // Hour (00..23)
  	            time.setHours( Number(str.substr(s,2)) );
  	            s += 2;
  	            break;
  	          case 'h': // Hour (01..12)
  	          case 'I': // Hour (01..12)
  	            time.setHours( Number(str.substr(s,2)) );
  	            s += 2;
  	            break;
  	          case 'i': // Minutes, numeric (00..59)
  	            time.setMinutes( Number(str.substr(s,2)) );
  	            s += 2;
  	            break;
  	          case 'k': // Hour (0..23)
  	            if ( ( s+1 < slen ) && this.dAt(str,s+1) )
  	            {
  	              time.setHours( Number(str.substr(s,2)) );
  	              s += 2;
  	            }
  	            else
  	            {
  	              time.setHours( Number(str.substr(s,1)) );
  	              s++;
  	            }
  	            break;
  	          case 'l': // Hour (1..12)
  	            if ( ( s+1 < slen ) && this.dAt(str,s+1) )
  	            {
  	              time.setHours( Number(str.substr(s,2)) );
  	              s += 2;
  	            }
  	            else
  	            {
  	              time.setHours( Number(str.substr(s,1)) );
  	              s++;
  	            }
  	            break;
  	          case 'M': // Month name (January..December)
  	            matched = false;
  	            for (sublen=_shortMon ; s + sublen <= slen ; sublen++ )
  	            {
  	              if ( sublen > _longMon )
  	                break;
  	              sub = str.substr(s,sublen);
  	              for ( i = 0 ; i < 12 ; i++ )
  	              {
  	                if ( this.mNames[i] == sub )
  	                {
  	                  time.setMonth( i );
  	                  matched = true;
  	                  s += sublen;
  	                  break;
  	                }
  	              }
  	              if ( matched )
  	                break;
  	            }
  	            break;
  	          case 'm': // Month, numeric (00..12)
  	            time.setMonth( (Number(str.substr(s,2))-1)%12 );
  	            s += 2;
  	            break;
  	          case 'p': // AM or PM
                if ( time.getHours() == 12 )
                {
  	              if ( str.charAt(s) == 'A' )
  	                time.setHours(0);
                }
                else if ( str.charAt(s) == 'P' )
  	              time.setHours( time.getHours() + 12 );
  	            s += 2;
  	            break;
  	          case 'r': // Time, 12-hour (hh:mm:ss followed by AM or PM)
  	            time.setHours(Number(str.substr(s,2)));
  	            time.setMinutes(Number(str.substr(s+3,2)));
  	            time.setSeconds(Number(str.substr(s+6,2)));
                if ( time.getHours() == 12 )
                {
  	              if ( str.charAt(s) == 'A' )
  	                time.setHours(0);
                }
                else if ( str.charAt(s) == 'P' )
  	              time.setHours( time.getHours() + 12 );
  	            s += 10;
  	            break;
  	          case 'S': // Seconds (00..59)
  	          case 's': // Seconds (00..59)
  	            time.setSeconds(Number(str.substr(s,2)));
  	            s += 2;
  	            break;
  	          case 'T': // Time, 24-hour (hh:mm:ss)
  	            time.setHours(Number(str.substr(s,2)));
  	            time.setMinutes(Number(str.substr(s+3,2)));
  	            time.setSeconds(Number(str.substr(s+6,2)));
  	            s += 8;
  	            break;
  	          case 'W': // Weekday name (Sunday..Saturday)
  	            matched = false;
  	            for (sublen=_shortDay ; s + sublen <= slen ; sublen++ )
  	            {
  	              if ( sublen > _longDay )
  	                break;
  	              sub = str.substr(s,sublen);
  	              for ( i = 0 ; i < 7 ; i++ )
  	              {
  	                if ( this.dNames[i] == sub )
  	                {
  	                  matched = true;
  	                  s += sublen;
  	                  break;
  	                }
  	              }
  	              if ( matched )
  	                break;
  	            }
  	            break;
              case 'w': // Day of the week (0=Sunday..6=Saturday) (ignored)
                s += 1;
                break;
  	          case 'Y': // Year, numeric, four digits, negative if before 0001
  	            i = 4;
  	            if ( str.substr(s,1) == '-' )
  	              i++;
  	            time.setFullYear(Number(str.substr(s,i)));
  	            s += i;
  	            break;
  	          case 'y': // Year, numeric (two digits), negative before baseYear
  	            i = 2;
  	            if ( str.substr(s,1) == '-' )
  	              i++;
  	            temp = Number(str.substr(s,i));
  	            if ( typeof(this.baseYear) == 'number' )
  	            	temp += this.baseYear;
  	            else if ( temp < 70 )
  	            	temp += 2000;
  	            else
  	            	temp += 1900;
  	            time.setFullYear(temp);
  	            s += i;
  	            break;
  	          case 'Z': // Year, numeric, four digits, unsigned (NON-MYSQL)
  	            time.setFullYear(Number(str.substr(s,4)));
  	            s += 4;
  	            break;
  	          case 'z': // Year, numeric, variable length, unsigned (NON-MYSQL)
  	            i = 0;
  	            while ( ( s < slen ) && this.dAt(str,s) )
  	              i = ( i * 10 ) + Number(str.charAt(s++));
  	            time.setFullYear(i);
  	            break;
  	          case '#': // signed timezone offset in minutes.
  	            if ( str.charAt(s++) == '-' )
  	            	tzSign = (-1);
  	            for ( tzOff = 0 ; ( s < slen ) && (String(i=Number(str.charAt(s)))==str.charAt(s)) ; s++ )
  	            	tzOff = ( tzOff * 10 ) + i;
  	            tzOff *= tzSign;
  	            break;
  	          case '@': // timezone label
  	        	_offPSI = (-1);
  	        	if ( AnyTime.utcLabel )
  	        	{
  		            matched = false;
  		            for ( tzOff in AnyTime.utcLabel )
                    if ( ! Array.prototype[tzOff] ) // prototype.js compatibility issue
  		              {
  		            	  for ( i = 0 ; i < AnyTime.utcLabel[tzOff].length ; i++ )
    		            	{
  	  	            		sub = AnyTime.utcLabel[tzOff][i];
  		              		sublen = sub.length;
  		              		if ( ( s+sublen <= slen ) && ( str.substr(s,sublen) == sub ) )
  		              		{
                          s+=sublen;
  		              			matched = true;
  		              			break;
  		              		}
  		              	}
  	            		  if ( matched )
  	            			  break;
  		              }
  		            if ( matched )
  		            {
  		            	_offPSI = i;
  		            	tzOff = Number(tzOff);
  		            	break; // case
  		            }
  	        	}
  	        	if ( ( s+9 < slen ) || ( str.substr(s,3) != "UTC" ) )
                      throw 'unknown time zone: '+str.substr(s);
  	        	s += 3;
  	            ch = ':'; // drop through for offset parsing
  	          case '-': // signed, 3-or-4-digit timezone offset in hours and minutes
  	          case '+': // signed, 4-digit timezone offset in hours and minutes
  	          case ':': // signed 4-digit timezone offset with colon delimiter
  	          case ';': // signed 3-or-4-digit timezone offset with colon delimiter
  	            if ( str.charAt(s++) == '-' )
  	            	tzSign = (-1);
  	            tzOff = Number(str.charAt(s));
  	            if ( (ch=='+')||(ch==':')||((s+3<slen)&&(String(Number(str.charAt(s+3)))!==str.charAt(s+3))) )
  	            	tzOff = (tzOff*10) + Number(str.charAt(++s));
                  tzOff *= 60;
  	        	if ( (ch==':') || (ch==';') )
  	        		s++; // skip ":" (assumed)
  	        	tzOff = ( tzOff + Number(str.substr(++s,2)) ) * tzSign;
  	        	s += 2;
  		        break;
  	          case 'j': // Day of year (001..366)
  	          case 'U': // Week (00..53), where Sunday is the first day of the week
  	          case 'u': // Week (00..53), where Monday is the first day of the week
  	          case 'V': // Week (01..53), where Sunday is the first day of the week; used with %X
  	          case 'v': // Week (01..53), where Monday is the first day of the week; used with %x
  	          case 'X': // Year for the week where Sunday is the first day of the week, numeric, four digits; used with %V
  	          case 'x': // Year for the week, where Monday is the first day of the week, numeric, four digits; used with %v
  	            throw '%'+this.fmt.charAt(f+1)+' not implemented by AnyTime.Converter';
  	          case '%': // A literal '%' character
  	          default: // for any character not listed above
  		        throw '%'+this.fmt.charAt(f+1)+' reserved for future use';
  	            break;
  	        }
  	        f++;
  	      } // if ( this.fmt.charAt(f) == '%' )
  	      else if ( this.fmt.charAt(f) != str.charAt(s) )
  	        throw str + ' is not in "' + this.fmt + '" format';
  	      else
  	        s++;
  	    } // for ( var f ... )
  	    if ( era < 0 )
  	      time.setFullYear( 0 - time.getFullYear() );
  		if ( tzOff != Number.MIN_VALUE )
  		{
  	       if ( _captureOffset )
  	    	 _offCap = tzOff;
  	       else
  	    	 time.setTime( ( time.getTime() - (tzOff*60000) ) - (time.getTimezoneOffset()*60000) );
  		}
  		
  	    return time;
  	    
  	}; // AnyTime.Converter.parse()
  	
  	//-------------------------------------------------------------------------
  	//  AnyTime.Converter.setUtcFormatOffsetAlleged()  sets the offset from 
      //  UTC, in minutes, to claim that a Date object represents during
  	//  formatting, even though it is formatted using local time.  This merely
  	//  reports the alleged offset when a timezone specifier (%#, %+, %-, %:,
  	//  %; or %@) is encountered in the format string--it does not otherwise
  	//  affect the date/time value.  This primarily exists so AnyTime.picker
  	//  can edit the time as specified (without conversion to local time) and
  	//  then convert the edited time to a different time zone (as selected
  	//  using the picker).  This method returns the previous value, if any,
  	//  set by the utcFormatOffsetAlleged option, or a previous call to
  	//  setUtcFormatOffsetAlleged(), or Number.MIN_VALUE if no offset was
  	//  previously-alleged.  Call this method with Number.MIN_VALUE to cancel
  	//  any prior value.  Note that if a format offset is alleged, any offset
  	//  specified by option utcFormatOffsetImposed is ignored.
  	//-------------------------------------------------------------------------
  	
  	this.setUtcFormatOffsetAlleged = function( offset )
  	{
  		var prev = _offAl;
  	    _offAl = offset;
  	    return prev;
  	};
  	
  	//-------------------------------------------------------------------------
  	//  AnyTime.Converter.setUtcFormatOffsetSubIndex() sets the sub-index
  	//  to choose from the AnyTime.utcLabel array of arrays when formatting
  	//  a Date using the %@ specifier.  For more information, see option
  	//  AnyTime.Converter.utcFormatOffsetSubIndex.  This primarily exists so
  	//  AnyTime.picker can specify the Time Zone label selected using the
  	//  picker).  This method returns the previous value, if any, set by the
  	//  utcFormatOffsetSubIndex option, or a previous call to
  	//  setUtcFormatOffsetAlleged(), or (-1) if no sub-index was previously-
  	//  chosen.  Call this method with (-1) to cancel any prior value.
  	//-------------------------------------------------------------------------
  	
  	this.setUtcFormatOffsetSubIndex = function( subIndex )
  	{
  		var prev = _offFSI;
  	    _offFSI = subIndex;
  	    return prev;
  	};
  	
  	//-------------------------------------------------------------------------
  	//	AnyTime.Converter construction code:
  	//-------------------------------------------------------------------------
  	  
  	(function(_this)
  	{
        var i, len;
  		
  		options = jQuery.extend(true,{},options||{});
  		
  	  	if ( options.baseYear )
  			_this.baseYear = Number(options.baseYear);
  		
  	  	if ( options.format )
  			_this.fmt = options.format;
  		
  	  	_flen = _this.fmt.length;
  		
  	  	if ( options.dayAbbreviations )
  	  		_this.dAbbr = $.makeArray( options.dayAbbreviations );
  		
  	  	if ( options.dayNames )
  	  	{
  	  		_this.dNames = $.makeArray( options.dayNames );
  	  		_longDay = 1;
  	  		_shortDay = 1000;
  	  		for ( i = 0 ; i < 7 ; i++ )
  	  		{
            len = _this.dNames[i].length;
  				if ( len > _longDay )
  					_longDay = len;
  				if ( len < _shortDay )
  					_shortDay = len;
  	  		}
  	  	}
  		
  	  	if ( options.eraAbbreviations )
  	  		_this.eAbbr = $.makeArray(options.eraAbbreviations);
  		
  	  	if ( options.monthAbbreviations )
  	  		_this.mAbbr = $.makeArray(options.monthAbbreviations);
  		
  	  	if ( options.monthNames )
  	  	{
  	  		_this.mNames = $.makeArray( options.monthNames );
  	  		_longMon = 1;
  	  		_shortMon = 1000;
  	  		for ( i = 0 ; i < 12 ; i++ )
  	  		{
  	  			len = _this.mNames[i].length;
  	  			if ( len > _longMon )
  					_longMon = len;
  	  			if ( len < _shortMon )
  	  				_shortMon = len;
  	  		}
  	  	}
  		
  	  	if ( typeof options.utcFormatOffsetImposed != "undefined" )
  	  		_offF = options.utcFormatOffsetImposed;
  
  	  	if ( typeof options.utcParseOffsetAssumed != "undefined" )
  	  		_offP = options.utcParseOffsetAssumed;
  		
  	  	if ( options.utcParseOffsetCapture )
  	  		_captureOffset = true;
  		
  	})(this); // AnyTime.Converter construction
  
  }; // AnyTime.Converter = 
  
  //=============================================================================
  //  AnyTime.noPicker()
  //
  //  Removes the date/time entry picker attached to a specified text field.
  //=============================================================================
  
  AnyTime.noPicker = function( id )
  {
  	if ( __pickers[id] )
  	{
  		__pickers[id].cleanup();
  		delete __pickers[id];
  	}
  };
  
  //=============================================================================
  //  AnyTime.picker()
  //
  //  Creates a date/time entry picker attached to a specified text field.
  //  Instead of entering a date and/or time into the text field, the user
  //  selects legal combinations using the picker, and the field is auto-
  //  matically populated.  The picker can be incorporated into the page
  //	"inline", or used as a "popup" that appears when the text field is
  //  clicked and disappears when the picker is dismissed. Ajax can be used
  //  to send the selected value to a server to approve or veto it.
  //
  //  To create a picker, simply include the necessary files in an HTML page
  //  and call the function for each date/time input field.  The following
  //  example creates a popup picker for field "foo" using the default
  //  format, and a second date-only (no time) inline (always-visible)
  //  Ajax-enabled picker for field "bar":
  //
  //    <link rel="stylesheet" type="text/css" href="anytime.css" />
  //    <script type="text/javascript" src="jquery.js"></script>
  //    <script type="text/javascript" src="anytime.js"></script>
  //    <input type="text" id="foo" tabindex="1" value="1967-07-30 23:45" />
  //    <input type="text" id="bar" tabindex="2" value="01/06/90" />
  //    <script type="text/javascript">
  //      AnyTime.picker( "foo" );
  //      AnyTime.picker( "bar", { placement:"inline", format: "%m/%d/%y",
  //								ajaxOptions { url: "/some/server/page/" } } );
  //    </script>
  //
  //  The appearance of the picker can be extensively modified using CSS styles.
  //  A default appearance can be achieved by the "anytime.css" stylesheet that
  //  accompanies this script.  The default style looks better in browsers other
  //  than Internet Explorer (before IE8) because older versions of IE do not
  //  properly implement the CSS box model standard; however, it is passable in
  //  Internet Explorer as well.
  //
  //  Method parameters:
  //
  //  id - the "id" attribute of the textfield to associate with the
  //    AnyTime.picker object.  The AnyTime.picker will attach itself
  //    to the textfield and manage its value.
  //
  //  options - an object (associative array) of optional parameters that
  //    override default behaviors.  The supported options are:
  //
  //    ajaxOptions - options passed to jQuery's $.ajax() method whenever
  //      the user dismisses a popup picker or selects a value in an inline
  //      picker.  The input's name (or ID) and value are passed to the
  //      server (appended to ajaxOptions.data, if present), and the
  //      "success" handler sets the input's value to the responseText.
  //      Therefore, the text returned by the server must be valid for the
  //      input'sdate/time format, and the server can approve or veto the
  //      value chosen by the user. For more information, see:
  //      http://docs.jquery.com/Ajax.
  //      If ajaxOptions.success is specified, it is used instead of the
  //      default "success" behavior.
  //
  //    askEra - if true, buttons to select the era are shown on the year
  //        selector popup, even if format specifier does not include the
  //        era.  If false, buttons to select the era are NOT shown, even
  //        if the format specifier includes ther era.  Normally, era buttons
  //        are only shown if the format string specifies the era.
  //
  //    askSecond - if false, buttons for number-of-seconds are not shown
  //        even if the format includes seconds.  Normally, the buttons
  //        are shown if the format string includes seconds.
  //
  //    earliest - String or Date object representing the earliest date/time
  //        that a user can select.  For best results if the field is only
  //        used to specify a date, be sure to set the time to 00:00:00.
  //        If a String is used, it will be parsed according to the picker's
  //        format (see AnyTime.Converter.format()).
  //
  //    firstDOW - a value from 0 (Sunday) to 6 (Saturday) stating which
  //      day should appear at the beginning of the week.  The default is 0
  //      (Sunday).  The most common substitution is 1 (Monday).  Note that
  //      if custom arrays are specified for AnyTime.Converter's dayAbbreviations
  //      and/or dayNames options, they should nonetheless begin with the
  //      value for Sunday.
  //
  //    hideInput - if true, the <input> is "hidden" (the picker appears in 
  //      its place). This actually sets the border, height, margin, padding
  //      and width of the field as small as possivle, so it can still get focus.
  //      If you try to hide the field using traditional techniques (such as
  //      setting "display:none"), the picker will not behave correctly.
  //
  //    labelDayOfMonth - the label for the day-of-month "buttons".
  //      Can be any HTML!  If not specified, "Day of Month" is assumed.
  //
  //    labelDismiss - the label for the dismiss "button" (if placement is
  //      "popup"). Can be any HTML!  If not specified, "X" is assumed.
  //
  //    labelHour - the label for the hour "buttons".
  //      Can be any HTML!  If not specified, "Hour" is assumed.
  //
  //    labelMinute - the label for the minute "buttons".
  //      Can be any HTML!  If not specified, "Minute" is assumed.
  //
  //    labelMonth - the label for the month "buttons".
  //      Can be any HTML!  If not specified, "Month" is assumed.
  //
  //    labelTimeZone - the label for the UTC offset (timezone) "buttons".
  //      Can be any HTML!  If not specified, "Time Zone" is assumed.
  //
  //    labelSecond - the label for the second "buttons".
  //      Can be any HTML!  If not specified, "Second" is assumed.
  //      This option is ignored if askSecond is false!
  //
  //    labelTitle - the label for the "title bar".  Can be any HTML!
  //      If not specified, then whichever of the following is most
  //      appropriate is used:  "Select a Date and Time", "Select a Date"
  //      or "Select a Time", or no label if only one field is present.
  //
  //    labelYear - the label for the year "buttons".
  //      Can be any HTML!  If not specified, "Year" is assumed.
  //
  //    latest - String or Date object representing the latest date/time
  //        that a user can select.  For best results if the field is only
  //        used to specify a date, be sure to set the time to 23:59:59.
  //        If a String is used, it will be parsed according to the picker's
  //        format (see AnyTime.Converter.format()).
  //
  //    placement - One of the following strings:
  //
  //      "popup" = the picker appears above its <input> when the input
  //        receives focus, and disappears when it is dismissed.  This is
  //        the default behavior.
  //
  //      "inline" = the picker is placed immediately after the <input>
  //        and remains visible at all times.  When choosing this placement,
  //        it is best to make the <input> invisible and use only the
  //        picker to select dates.  The <input> value can still be used
  //        during form submission as it will always reflect the current
  //        picker state.
  //
  //        WARNING: when using "inline" and XHTML and including a day-of-
  //        the-month format field, the input may only appear where a <table>
  //        element is permitted (for example, NOT within a <p> element).
  //        This is because the picker uses a <table> element to arrange
  //        the day-of-the-month (calendar) buttons.  Failure to follow this
  //        advice may result in an "unknown error" in Internet Explorer.
  //
  //    The following additional options may be specified; see documentation
  //    for AnyTime.Converter (above) for information about these options:
  //
  //      baseYear
  //      dayAbbreviations
  //      dayNames
  //      eraAbbreviations
  //      format
  //      monthAbbreviations
  //      monthNames
  //
  //  Other behavior, such as how to format the values on the display
  //  and which "buttons" to include, is inferred from the format string.
  //=============================================================================
  
  AnyTime.picker = function( id, options )
  {
  	//  Create a new private object instance to manage the picker,
  	//  if one does not already exist.
  	
      if ( __pickers[id] )
      	throw 'Cannot create another AnyTime.picker for "'+id+'"';
  
  	var _this = null;
  
  	__pickers[id] =
  	{
  		//  private members
  		
  		twelveHr: false,
  		ajaxOpts: null,		// options for AJAX requests
  		denyTab: true,      // set to true to stop Opera from tabbing away
  		askEra: false,		// prompt the user for the era in yDiv?
  		cloak: null,		// cloak div
  		conv: null,			// AnyTime.Converter
  	  	bMinW: 0,			// min width of body div
  	  	bMinH: 0,			// min height of body div
  	  	dMinW: 0,    		// min width of date div
  	  	dMinH: 0,			// min height of date div
  		div: null,			// picker div
  	  	dB: null,			// body div
  	  	dD: null,			// date div
  	  	dY: null,			// years div
  	  	dMo: null,			// months div
  	  	dDoM: null,			// date-of-month table
  	  	hDoM: null,			// date-of-month heading
  	  	hMo: null,			// month heading
  	  	hTitle: null,		// title heading
  	  	hY: null,			// year heading
  	  	dT: null,			// time div
  	  	dH: null,			// hours div
  	  	dM: null,			// minutes div
  	  	dS: null,			// seconds div
  	  	dO: null,           // offset (time zone) div
  		earliest: null,		// earliest selectable date/time
  		fBtn: null,			// button with current focus
  		fDOW: 0,			// index to use as first day-of-week
  	    hBlur: null,        // input handler
  	    hClick: null,       // input handler
  	    hFocus: null,       // input handler
  	    hKeydown: null,     // input handler
  	    hKeypress: null,    // input handler
  		id: null,			// picker ID
  		inp: null,			// input text field
  		latest: null,		// latest selectable date/time
  		lastAjax: null,		// last value submitted using AJAX
  		lostFocus: false,	// when focus is lost, must redraw
  		lX: 'X',			// label for dismiss button
  		lY: 'Year',			// label for year
  		lO: 'Time Zone',    // label for UTC offset (time zone)
  		oBody: null,        // UTC offset selector popup
  		oConv: null,        // AnyTime.Converter for offset display
  		oCur: null,         // current-UTC-offset button
  		oDiv: null,			// UTC offset selector popup
  		oLab: null,			// UTC offset label
  		oListMinW: 0,       // min width of offset list element
  		oMinW: 0,           // min width of UTC offset element
  		oSel: null,         // select (plus/minus) UTC-offset button
  		offMin: Number.MIN_VALUE, // current UTC offset in minutes
  		offSI: -1,          // current UTC label sub-index (if any)
  		offStr: "",         // current UTC offset (time zone) string
  		pop: true,			// picker is a popup?
  		time: null,			// current date/time
  	  	tMinW: 0,			// min width of time div
  	  	tMinH: 0,			// min height of time div
  		url: null,			// URL to submit value using AJAX
  	  	wMinW: 0,			// min width of picker
  	  	wMinH: 0,			// min height of picker
  		yAhead: null,		// years-ahead button
  		y0XXX: null,		// millenium-digit-zero button (for focus)
  		yCur: null,			// current-year button
  		yDiv: null,			// year selector popup
  		yLab: null,			// year label
  		yNext: null,		// next-year button
  		yPast: null,		// years-past button
  		yPrior: null,		// prior-year button
  
  		//---------------------------------------------------------------------
  		//  .initialize() initializes the picker instance.
  		//---------------------------------------------------------------------
  
  		initialize: function( id )
  		{
  			_this = this;
  
        this.id = 'AnyTime--'+id.replace(/[^-_.A-Za-z0-9]/g,'--AnyTime--');
  
  			options = jQuery.extend(true,{},options||{});
  		  	options.utcParseOffsetCapture = true;
  		  	this.conv = new AnyTime.Converter(options);
  
  		  	if ( options.placement )
  		  	{
  		  		if ( options.placement == 'inline' )
  		  			this.pop = false;
  		  		else if ( options.placement != 'popup' )
  		  			throw 'unknown placement: ' + options.placement;
  		  	}
  
  		  	if ( options.ajaxOptions )
  		  	{
  		  		this.ajaxOpts = jQuery.extend( {}, options.ajaxOptions );
  		        if ( ! this.ajaxOpts.success )
  		        	this.ajaxOpts.success = function(data,status) { _this.inp.val(data); };
  		  	}
  		    
  		  	if ( options.earliest )
  		  	{
  		  		if ( typeof options.earliest.getTime == 'function' )
  		  			this.earliest = options.earliest.getTime();
  		  		else
  		  			this.earliest = this.conv.parse( options.earliest.toString() );
  		  	}
  
  		  	if ( options.firstDOW )
  		  	{
  		  		if ( ( options.firstDOW < 0 ) || ( options.firstDOW > 6 ) )
  		  			throw new Exception('illegal firstDOW: ' + options.firstDOW); 
  		  		this.fDOW = options.firstDOW;
  		  	}
  
  		  	if ( options.latest )
  		  	{
  		  		if ( typeof options.latest.getTime == 'function' )
  		  			this.latest = options.latest.getTime();
  		  		else
  		  			this.latest = this.conv.parse( options.latest.toString() );
  		  	}
  
  		  	this.lX = options.labelDismiss || 'X';
  		  	this.lY = options.labelYear || 'Year';
  		  	this.lO = options.labelTimeZone || 'Time Zone';
  
  		  	//  Infer what we can about what to display from the format.
  
  		  	var i;
  		  	var t;
  		  	var lab;
  		  	var shownFields = 0;
  		  	var format = this.conv.fmt;
  
  		  	if ( typeof options.askEra != 'undefined' )
  		  		this.askEra = options.askEra;
  		  	else
  		  		this.askEra = (format.indexOf('%B')>=0) || (format.indexOf('%C')>=0) || (format.indexOf('%E')>=0);
  		  	var askYear = (format.indexOf('%Y')>=0) || (format.indexOf('%y')>=0) || (format.indexOf('%Z')>=0) || (format.indexOf('%z')>=0);
  		  	var askMonth = (format.indexOf('%b')>=0) || (format.indexOf('%c')>=0) || (format.indexOf('%M')>=0) || (format.indexOf('%m')>=0);
  		  	var askDoM = (format.indexOf('%D')>=0) || (format.indexOf('%d')>=0) || (format.indexOf('%e')>=0);
  		  	var askDate = askYear || askMonth || askDoM;
  		  	this.twelveHr = (format.indexOf('%h')>=0) || (format.indexOf('%I')>=0) || (format.indexOf('%l')>=0) || (format.indexOf('%r')>=0);
  		  	var askHour = this.twelveHr || (format.indexOf('%H')>=0) || (format.indexOf('%k')>=0) || (format.indexOf('%T')>=0);
  		  	var askMinute = (format.indexOf('%i')>=0) || (format.indexOf('%r')>=0) || (format.indexOf('%T')>=0);
  		  	var askSec = ( (format.indexOf('%r')>=0) || (format.indexOf('%S')>=0) || (format.indexOf('%s')>=0) || (format.indexOf('%T')>=0) );
  		  	if ( askSec && ( typeof options.askSecond != 'undefined' ) )
  		  		askSec = options.askSecond;
  		  	var askOff = ( (format.indexOf('%#')>=0) || (format.indexOf('%+')>=0) || (format.indexOf('%-')>=0) || (format.indexOf('%:')>=0) || (format.indexOf('%;')>=0) || (format.indexOf('%<')>=0) || (format.indexOf('%>')>=0) || (format.indexOf('%@')>=0) );
  		  	var askTime = askHour || askMinute || askSec || askOff;
  
  		  	if ( askOff )
  			  	this.oConv = new AnyTime.Converter( { format: options.formatUtcOffset || 
  			  		format.match(/\S*%[-+:;<>#@]\S*/g).join(' ') } );
  
  		  	//  Create the picker HTML and add it to the page.
  		  	//  Popup pickers will be moved to the end of the body
  		  	//  once the entire page has loaded.
  
          this.inp = $(document.getElementById(id)); // avoids ID-vs-pseudo-selector probs like id="foo:bar"
  		  	this.div = $( '<div class="AnyTime-win AnyTime-pkr ui-widget ui-widget-content ui-corner-all" style="width:0;height:0" id="' + this.id + '" aria-live="off"/>' );
  		    this.inp.after(this.div);
  		  	this.wMinW = this.div.outerWidth(!$.browser.safari);
  		  	this.wMinH = this.div.AnyTime_height(true);
  		  	this.hTitle = $( '<h5 class="AnyTime-hdr ui-widget-header ui-corner-top"/>' ); 
  		  	this.div.append( this.hTitle );
  		  	this.dB = $( '<div class="AnyTime-body" style="width:0;height:0"/>' );
  		  	this.div.append( this.dB );
  		  	this.bMinW = this.dB.outerWidth(true);
  		  	this.bMinH = this.dB.AnyTime_height(true);
  
  		  	if ( options.hideInput )
  		        this.inp.css({border:0,height:'1px',margin:0,padding:0,width:'1px'});
  		  	
  		  	//  Add dismiss box to title (if popup)
  
  		  	t = null;
  		  	var xDiv = null;
  		  	if ( this.pop )
  		  	{
  		  		xDiv = $( '<div class="AnyTime-x-btn ui-state-default">'+this.lX+'</div>' );
  		  		this.hTitle.append( xDiv );
  		  		xDiv.click(function(e){_this.dismiss(e);});
  		  	}
  
  		  	//  date (calendar) portion
  
  		  	lab = '';
  		  	if ( askDate )
  		  	{
  			  this.dD = $( '<div class="AnyTime-date" style="width:0;height:0"/>' );
  			  this.dB.append( this.dD );
  		  	  this.dMinW = this.dD.outerWidth(true);
  		  	  this.dMinH = this.dD.AnyTime_height(true);
  
  		      if ( askYear )
  		      {
  		    	  this.yLab = $('<h6 class="AnyTime-lbl AnyTime-lbl-yr">' + this.lY + '</h6>');
  		    	  this.dD.append( this.yLab );
  
  		          this.dY = $( '<ul class="AnyTime-yrs ui-helper-reset" />' );
  		          this.dD.append( this.dY );
  
  		          this.yPast = this.btn(this.dY,'&lt;',this.newYear,['yrs-past'],'- '+this.lY);
  		          this.yPrior = this.btn(this.dY,'1',this.newYear,['yr-prior'],'-1 '+this.lY);
  		          this.yCur = this.btn(this.dY,'2',this.newYear,['yr-cur'],this.lY);
  		          this.yCur.removeClass('ui-state-default');
  		          this.yCur.addClass('AnyTime-cur-btn ui-state-default ui-state-highlight');
  
  		          this.yNext = this.btn(this.dY,'3',this.newYear,['yr-next'],'+1 '+this.lY);
  		          this.yAhead = this.btn(this.dY,'&gt;',this.newYear,['yrs-ahead'],'+ '+this.lY);
  		          
  		          shownFields++;
  
  		      } // if ( askYear )
  
  		      if ( askMonth )
  		      {
  		    	  lab = options.labelMonth || 'Month';
  		    	  this.hMo = $( '<h6 class="AnyTime-lbl AnyTime-lbl-month">' + lab + '</h6>' );
  		    	  this.dD.append( this.hMo );
  		    	  this.dMo = $('<ul class="AnyTime-mons" />');
  		    	  this.dD.append(this.dMo);
  		    	  for ( i = 0 ; i < 12 ; i++ )
  		    	  {
  		    		  var mBtn = this.btn( this.dMo, this.conv.mAbbr[i], 
  			    			function( event )
  			    			{
  			    				var elem = $(event.target);
  			    			    if ( elem.hasClass("AnyTime-out-btn") )
  			    			    	return;
  			    				var mo = event.target.AnyTime_month;
  			    				var t = new Date(this.time.getTime());
  			    				if ( t.getDate() > __daysIn[mo] )
  			    					t.setDate(__daysIn[mo])
  			    				t.setMonth(mo);
  			    				this.set(t);
  			    			    this.upd(elem);
  			    			},
  			    			['mon','mon'+String(i+1)], lab+' '+this.conv.mNames[i] );
  		    		  mBtn[0].AnyTime_month = i;
  		    	  }
  		    	  shownFields++;
  		      }
  
  		      if ( askDoM )
  		      {
  		    	lab = options.labelDayOfMonth || 'Day of Month';
  		        this.hDoM = $('<h6 class="AnyTime-lbl AnyTime-lbl-dom">' + lab + '</h6>' );
  		      	this.dD.append( this.hDoM );
  		        this.dDoM =  $( '<table border="0" cellpadding="0" cellspacing="0" class="AnyTime-dom-table"/>' );
  		        this.dD.append( this.dDoM );
  		        t = $( '<thead class="AnyTime-dom-head"/>' );
  		        this.dDoM.append(t);
  		        var tr = $( '<tr class="AnyTime-dow"/>' );
  		        t.append(tr);
  		        for ( i = 0 ; i < 7 ; i++ )
  		          tr.append( '<th class="AnyTime-dow AnyTime-dow'+String(i+1)+'">'+this.conv.dAbbr[(this.fDOW+i)%7]+'</th>' );
  
  		        var tbody = $( '<tbody class="AnyTime-dom-body" />' );
  		        this.dDoM.append(tbody);
  		        for ( var r = 0 ; r < 6 ; r++ )
  		        {
  		          tr = $( '<tr class="AnyTime-wk AnyTime-wk'+String(r+1)+'"/>' );
  		          tbody.append(tr);
  		          for ( i = 0 ; i < 7 ; i++ )
  		        	  this.btn( tr, 'x',
  		        		function( event )
  		        		{
  		        			var elem = $(event.target);
  		        		    if ( elem.hasClass("AnyTime-out-btn") )
  		        		    	return;
  		        			var dom = Number(elem.html());
  		        			if ( dom )
  		        			{
  		        				var t = new Date(this.time.getTime());
  		        				t.setDate(dom);
  		        				this.set(t);
  		        				this.upd(elem);
  		        			}
  		        		},
  		        		['dom'], lab );
  		        }
  		        shownFields++;
  
  		      } // if ( askDoM )
  
  		    } // if ( askDate )
  
  		    //  time portion
  
  		    if ( askTime )
  		    {
            var tensDiv, onesDiv;
  
  		      this.dT = $('<div class="AnyTime-time" style="width:0;height:0" />');
  		      this.dB.append(this.dT);
  		  	  this.tMinW = this.dT.outerWidth(true);
  		  	  this.tMinH = this.dT.AnyTime_height(true);
  
  		      if ( askHour )
  		      {
  		        this.dH = $('<div class="AnyTime-hrs"/>');
  		        this.dT.append(this.dH);
  
  		        lab = options.labelHour || 'Hour';
  		        this.dH.append( $('<h6 class="AnyTime-lbl AnyTime-lbl-hr">'+lab+'</h6>') );
  		        var amDiv = $('<ul class="AnyTime-hrs-am"/>');
  		        this.dH.append( amDiv );
  		        var pmDiv = $('<ul class="AnyTime-hrs-pm"/>');
  		        this.dH.append( pmDiv );
  
  		        for ( i = 0 ; i < 12 ; i++ )
  		        {
  		          if ( this.twelveHr )
  		          {
  		            if ( i == 0 )
  		              t = '12am';
  		            else
  		              t = String(i)+'am';
  		          }
  		          else
  		            t = AnyTime.pad(i,2);
  
  		          this.btn( amDiv, t, this.newHour,['hr','hr'+String(i)],lab+' '+t);
  
  		          if ( this.twelveHr )
  		          {
  		            if ( i == 0 )
  		              t = '12pm';
  		            else
  		              t = String(i)+'pm';
  		          }
  		          else
  		            t = i+12;
  
  		          this.btn( pmDiv, t, this.newHour,['hr','hr'+String(i+12)],lab+' '+t);
  		        }
  
  				shownFields++;
  				
  		      } // if ( askHour )
  
  		      if ( askMinute )
  		      {
  		        this.dM = $('<div class="AnyTime-mins"/>');
  		        this.dT.append(this.dM);
  
  		        lab = options.labelMinute || 'Minute';
  		        this.dM.append( $('<h6 class="AnyTime-lbl AnyTime-lbl-min">'+lab+'</h6>') );
              tensDiv = $('<ul class="AnyTime-mins-tens"/>');
  		        this.dM.append(tensDiv);
  
  		        for ( i = 0 ; i < 6 ; i++ )
  		          this.btn( tensDiv, i, 
  		        		  function( event )
  		        		  {
  		        		      var elem = $(event.target);
  		        			  if ( elem.hasClass("AnyTime-out-btn") )
  		        			    	return;
  		        		      var t = new Date(this.time.getTime());
  		        		      t.setMinutes( (Number(elem.text())*10) + (this.time.getMinutes()%10) );
  		        		      this.set(t);
  		        		      this.upd(elem);
  		        		  },
  		        		  ['min-ten','min'+i+'0'], lab+' '+i+'0' );
  		        for ( ; i < 12 ; i++ )
  			          this.btn( tensDiv, '&#160;', $.noop, ['min-ten','min'+i+'0'], lab+' '+i+'0' ).addClass('AnyTime-min-ten-btn-empty ui-state-default ui-state-disabled');
  
              onesDiv = $('<ul class="AnyTime-mins-ones"/>');
  		        this.dM.append(onesDiv);
  		        for ( i = 0 ; i < 10 ; i++ )
  		          this.btn( onesDiv, i, 
  		    		  function( event )
  		    		  {
  		    		      var elem = $(event.target);
  		    			  if ( elem.hasClass("AnyTime-out-btn") )
  		    			    	return;
  		    		      var t = new Date(this.time.getTime());
  		    		      t.setMinutes( (Math.floor(this.time.getMinutes()/10)*10)+Number(elem.text()) );
  		    		      this.set(t);
  		    		      this.upd(elem);  
  		    		  },
  		    		  ['min-one','min'+i], lab+' '+i );
  		        for ( ; i < 12 ; i++ )
  			          this.btn( onesDiv, '&#160;', $.noop, ['min-one','min'+i+'0'], lab+' '+i ).addClass('AnyTime-min-one-btn-empty ui-state-default ui-state-disabled');
  
  				shownFields++;
  
  		      } // if ( askMinute )
  
  		      if ( askSec )
  		      {
  		        this.dS = $('<div class="AnyTime-secs"/>');
  		        this.dT.append(this.dS);
  		        lab = options.labelSecond || 'Second';
  		        this.dS.append( $('<h6 class="AnyTime-lbl AnyTime-lbl-sec">'+lab+'</h6>') );
              tensDiv = $('<ul class="AnyTime-secs-tens"/>');
  		        this.dS.append(tensDiv);
  
  		        for ( i = 0 ; i < 6 ; i++ )
  		          this.btn( tensDiv, i,
  		    		  function( event )
  		    		  {
  		    		      var elem = $(event.target);
  		    			  if ( elem.hasClass("AnyTime-out-btn") )
  		    			    	return;
  		    		      var t = new Date(this.time.getTime());
  		    		      t.setSeconds( (Number(elem.text())*10) + (this.time.getSeconds()%10) );
  		    		      this.set(t);
  		    		      this.upd(elem);
  		    		  },
  		    		  ['sec-ten','sec'+i+'0'], lab+' '+i+'0' );
  		        for ( ; i < 12 ; i++ )
  			          this.btn( tensDiv, '&#160;', $.noop, ['sec-ten','sec'+i+'0'], lab+' '+i+'0' ).addClass('AnyTime-sec-ten-btn-empty ui-state-default ui-state-disabled');
  
              onesDiv = $('<ul class="AnyTime-secs-ones"/>');
  		        this.dS.append(onesDiv);
  		        for ( i = 0 ; i < 10 ; i++ )
  		          this.btn( onesDiv, i,
  		    		  function( event )
  		    		  {
  		    		      var elem = $(event.target);
  		    			  if ( elem.hasClass("AnyTime-out-btn") )
  		    			    	return;
  		    		      var t = new Date(this.time.getTime());
  		    		      t.setSeconds( (Math.floor(this.time.getSeconds()/10)*10) + Number(elem.text()) );
  		    		      this.set(t);
  		    		      this.upd(elem);
  		    		  },
  		    		  ['sec-one','sec'+i], lab+' '+i );
  		        for ( ; i < 12 ; i++ )
  			          this.btn( onesDiv, '&#160;', $.noop, ['sec-one','sec'+i+'0'], lab+' '+i ).addClass('AnyTime-sec-one-btn-empty ui-state-default ui-state-disabled');
  
  				shownFields++;
  
  		      } // if ( askSec )
  
  		      if ( askOff )
  		      {
  		    	this.dO = $('<div class="AnyTime-offs" />');
  		        this.dT.append(this.dO);
  			  	this.oMinW = this.dO.outerWidth(true);
  		        
  		    	this.oLab = $('<h6 class="AnyTime-lbl AnyTime-lbl-off">' + this.lO + '</h6>');
  		    	this.dO.append( this.oLab );
  		        
  		    	var offDiv = $('<ul class="AnyTime-off-list ui-helper-reset" />');
  		        this.dO.append(offDiv);
  		        
  		        this.oCur = this.btn(offDiv,'',this.newOffset,['off','off-cur'],lab);
  		        this.oCur.removeClass('ui-state-default');
  		        this.oCur.addClass('AnyTime-cur-btn ui-state-default ui-state-highlight');
  		        this.oCur.css({overflow:"hidden"});
  
  			  	this.oSel = this.btn(offDiv,'&#177;',this.newOffset,['off','off-select'],'+/- '+this.lO);
  			  	this.oListMinW = this.oCur.outerWidth(true)+this.oSel.outerWidth(true);
  
  				shownFields++;
  		      }
  		      
  		    } // if ( askTime )
  
  		    //  Set the title.  If a title option has been specified, use it.
  		    //  Otherwise, determine a worthy title based on which (and how many)
  		    //  format fields have been specified.
  
  		    if ( options.labelTitle )
  		      this.hTitle.append( options.labelTitle );
  		    else if ( shownFields > 1 )
  		      this.hTitle.append( 'Select a '+(askDate?(askTime?'Date and Time':'Date'):'Time') );
  		    else
  		      this.hTitle.append( 'Select' );
  
  
  		    //  Initialize the picker's date/time value.
  
  		    try
  		    {
  		      this.time = this.conv.parse(this.inp.val());
  		      this.offMin = this.conv.getUtcParseOffsetCaptured();
  		      this.offSI = this.conv.getUtcParseOffsetSubIndex();
  		    }
  		    catch ( e )
  		    {
  		      this.time = new Date();
  		    }
  		    this.lastAjax = this.time;
  
  
  		    //  If this is a popup picker, hide it until needed.
  
  		    if ( this.pop )
  		    {
  		      this.div.hide();
  		      if ( __iframe )
  		        __iframe.hide();
  		      this.div.css('position','absolute');
  		    }
  			
  		    //  Setup event listeners for the input and resize listeners for
  		    //  the picker.  Add the picker to the instances list (which is used
  		    //  to hide pickers if the user clicks off of them).
  
  		    this.inp.blur( this.hBlur =
  		    	function(e)
  		    	{
  		    		_this.inpBlur(e);
  		    	} );
  		    
  		    this.inp.click( this.hClick =
  		    	function(e)
  		    	{
  	    			_this.showPkr(e);
  		    	} );
  		    
  		    this.inp.focus( this.hFocus =
  		    	function(e)
  		    	{
  		    		if ( _this.lostFocus )
  		    			_this.showPkr(e);
  		    		_this.lostFocus = false;
  		    	} );
  		    
  		    this.inp.keydown( this.hKeydown =
  		    	function(e)
  		    	{
  		    		_this.key(e);
  		    	} );
  		    
  		    this.inp.keypress( this.hKeypress =
  			    	function(e)
  			    	{
  			    		if ( $.browser.opera && _this.denyTab )
  			    			e.preventDefault();
  			    	} );
  			    
  		    this.div.click( 
  				function(e)
  				{
  					_this.lostFocus = false;
  					_this.inp.focus();
  				} );
  		    
  		    $(window).resize( 
  		    	function(e)
  		    	{
  		    		_this.pos(e);
  		    	} );
  		    
  		    if ( __initialized )
  		    	this.onReady();
  
  		}, // initialize()
  
  
  		//---------------------------------------------------------------------
  		//  .ajax() notifies the server of a value change using Ajax.
  		//---------------------------------------------------------------------
  
  		ajax: function()
  		{
  		    if ( this.ajaxOpts && ( this.time.getTime() != this.lastAjax.getTime() ) )
  		    {
  		      try
  		      {
  		    	var opts = jQuery.extend( {}, this.ajaxOpts );
  		        if ( typeof opts.data == 'object' )
  		        	opts.data[this.inp[0].name||this.inp[0].id] = this.inp.val();
  		        else
  		        {
  		        	var opt = (this.inp[0].name||this.inp[0].id) + '=' + encodeURI(this.inp.val());
  		        	if ( opts.data )
  		        		opts.data += '&' + opt;
  		        	else
  		        		opts.data = opt;
  		        }
  		        $.ajax( opts );
  		        this.lastAjax = this.time;
  		      }
  		      catch( e )
  		      {
  		      }
  		    }
  		    return;
  		
  		}, // .ajax()
  
  		//---------------------------------------------------------------------
  		//  .askOffset() is called by this.newOffset() when the UTC offset or
  		//  +- selection button is clicked.
  		//---------------------------------------------------------------------
  
  		askOffset: function( event )
  		{
  		    if ( ! this.oDiv )
  		    {
  		      this.makeCloak();
  		
  		      this.oDiv = $('<div class="AnyTime-win AnyTime-off-selector ui-widget ui-widget-content ui-corner-all" style="position:absolute" />');
  		      this.div.append(this.oDiv);
  		
  		      // the order here (HDR,BODY,XDIV,TITLE) is important for width calcluation:
  		      var title = $('<h5 class="AnyTime-hdr AnyTime-hdr-off-selector ui-widget-header ui-corner-top" />');
  		      this.oDiv.append( title );
  		      this.oBody = $('<div class="AnyTime-body AnyTime-body-off-selector" style="overflow:auto;white-space:nowrap" />');
  		      this.oDiv.append( this.oBody );
  		      var oBHS = this.oBody.AnyTime_height(true); // body spacing
  		      var oBWS = this.oBody.AnyTime_width(true);
  		      var oTWS = title.AnyTime_width(true);
  		      
  		      var xDiv = $('<div class="AnyTime-x-btn ui-state-default">'+this.lX+'</div>');
  		      title.append(xDiv);
  		      xDiv.click(function(e){_this.dismissODiv(e);});
  		      title.append( this.lO );
  			  if ( __msie6 || __msie7 ) // IE bugs!
  				  title.width(String(this.lO.length*0.8)+"em");
  			  var oBW = title.AnyTime_width(true) - oBWS; // initial body width
  		      
  		      var cont = $('<ul class="AnyTime-off-off" />' );
  		      var last = null;
  		      this.oBody.append(cont);
  		      var useSubIndex = (this.oConv.fmt.indexOf('%@')>=0);
  		      var btnW = 0; // determine uniform button width
  		      if ( AnyTime.utcLabel )
  			      for ( var o = -720 ; o < 720 ; o++ )
  			    	  if ( AnyTime.utcLabel[o] )
  			    	  {
  				        this.oConv.setUtcFormatOffsetAlleged(o);
  				        for ( var i = 0; i < AnyTime.utcLabel[o].length; i++ )
  				        {
  				          this.oConv.setUtcFormatOffsetSubIndex(i);
  				          last = this.btn( cont, this.oConv.format(this.time), this.newOPos, ['off-off'], o );
  				          last[0].AnyTime_offMin = o;
  				          last[0].AnyTime_offSI = i;
  				          var w = last.width();
  				          if ( w > btnW )
  				        	  btnW = w;
  				          if ( ! useSubIndex )
  				        	  break; // for
  				        }
  			    	  }
  			          
  		      if ( last )
  		    	  last.addClass('AnyTime-off-off-last-btn');
  		      
  		      // compute optimal width
  		      
  		      this.oBody.find('.AnyTime-off-off-btn').width(btnW); // set uniform button width
  		      if ( last )
  		      {
  		          var lW = last.AnyTime_width(true);
  		          if ( lW > oBW )
  			          oBW = lW+1; // expand body to hold buttons
  		      }
  		      this.oBody.width(oBW);
  		      oBW = this.oBody.AnyTime_width(true);
  		      this.oDiv.width( oBW );		      
  		      if ( __msie6 || __msie7 ) // IE bugs!
  				  title.width( oBW - oTWS );
  
  		      // compute optimal height
  		      
  		      var oH = this.oDiv.AnyTime_height(true);
  		      var oHmax = this.div.height() * 0.75;
  		      if ( oH > oHmax )
  		      {
  		    	  oH = oHmax;
  		    	  this.oBody.height(oH-(title.AnyTime_height(true)+oBHS));
  			      this.oBody.width(this.oBody.width()+20); // add nominal px for scrollbar 
  			      this.oDiv.width(this.oDiv.width()+20); 
  			      if ( __msie6 || __msie7 ) // IE bugs!
  					  title.width( this.oBody.AnyTime_width(true) - oTWS );
  		      }
  			  if ( ! __msie7 ) // IE7 bug!
  				  this.oDiv.height(String(oH)+'px');
  
  		    } // if ( ! this.oDiv )
  		    else
  		    {
  		      this.cloak.show();
  		      this.oDiv.show();
  		    }
  		    this.pos(event);
  		    this.updODiv(null);
  
  		    var f = this.oDiv.find('.AnyTime-off-off-btn.AnyTime-cur-btn:first');
  		    if ( ! f.length )
  		    	f = this.oDiv.find('.AnyTime-off-off-btn:first');
  		    this.setFocus( f );
  		
  		}, // .askOffset()
  
  		//---------------------------------------------------------------------
  		//  .askYear() is called by this.newYear() when the yPast or yAhead
  		//  button is clicked.
  		//---------------------------------------------------------------------
  
  		askYear: function( event )
  		{
  		    if ( ! this.yDiv )
  		    {
  		      this.makeCloak();
  		
  		      this.yDiv = $('<div class="AnyTime-win AnyTime-yr-selector ui-widget ui-widget-content ui-corner-all" style="position:absolute" />');
  		      this.div.append(this.yDiv);
  		
  		      var title = $('<h5 class="AnyTime-hdr AnyTime-hdr-yr-selector ui-widget-header ui-corner-top" />');
  		      this.yDiv.append( title );
  		
  		      var xDiv = $('<div class="AnyTime-x-btn ui-state-default">'+this.lX+'</div>');
  		      title.append(xDiv);
  		      xDiv.click(function(e){_this.dismissYDiv(e);});
  		
  		      title.append( this.lY );
  		
  		      var yBody = $('<div class="AnyTime-body AnyTime-body-yr-selector" />');
  		      var yW = yBody.AnyTime_width(true);
  		      var yH = 0;
  		      this.yDiv.append( yBody );
  		      
  		      cont = $('<ul class="AnyTime-yr-mil" />' );
  		      yBody.append(cont);
  		      this.y0XXX = this.btn( cont, 0, this.newYPos,['mil','mil0'],this.lY+' '+0+'000');
  		      for ( i = 1; i < 10 ; i++ )
  		        this.btn( cont, i, this.newYPos,['mil','mil'+i],this.lY+' '+i+'000');
  		      yW += cont.AnyTime_width(true);
  		      if ( yH < cont.AnyTime_height(true) )
  		    	  yH = cont.AnyTime_height(true);
  		
  			  cont = $('<ul class="AnyTime-yr-cent" />' );
  		      yBody.append(cont);
  		      for ( i = 0 ; i < 10 ; i++ )
  		        this.btn( cont, i, this.newYPos,['cent','cent'+i],this.lY+' '+i+'00');
  		      yW += cont.AnyTime_width(true);
  		      if ( yH < cont.AnyTime_height(true) )
  		    	  yH = cont.AnyTime_height(true);
  
  		      cont = $('<ul class="AnyTime-yr-dec" />');
  		      yBody.append(cont);
  		      for ( i = 0 ; i < 10 ; i++ )
  		        this.btn( cont, i, this.newYPos,['dec','dec'+i],this.lY+' '+i+'0');
  		      yW += cont.AnyTime_width(true);
  		      if ( yH < cont.AnyTime_height(true) )
  		    	  yH = cont.AnyTime_height(true);
  		
  		      cont = $('<ul class="AnyTime-yr-yr" />');
  		      yBody.append(cont);
  		      for ( i = 0 ; i < 10 ; i++ )
  		        this.btn( cont, i, this.newYPos,['yr','yr'+i],this.lY+' '+i );
  		      yW += cont.AnyTime_width(true);
  		      if ( yH < cont.AnyTime_height(true) )
  		    	  yH = cont.AnyTime_height(true);
  		
  		      if ( this.askEra )
  		      {
  		        cont = $('<ul class="AnyTime-yr-era" />' );
  		        yBody.append(cont);
  		
  		        this.btn( cont, this.conv.eAbbr[0],
  		        		function( event )
  		        		{
  	  		      			var t = new Date(this.time.getTime());
  		        			var year = t.getFullYear();
  		        		    if ( year > 0 )
  								t.setFullYear(0-year);
  							this.set(t);
  							this.updYDiv($(event.target));
  		        		},
  		        		['era','bce'], this.conv.eAbbr[0] );
  		
  		        this.btn( cont, this.conv.eAbbr[1],
  		        		function( event )
  		        		{
  			      			var t = new Date(this.time.getTime());
  		        			var year = t.getFullYear();
  		        		    if ( year < 0 )
  								t.setFullYear(0-year);
  							this.set(t);
  							this.updYDiv($(event.target));
  		        		},
  		        		['era','ce'], this.conv.eAbbr[1] );
  		        
  		        yW += cont.AnyTime_width(true);
  		        if ( yH < cont.AnyTime_height(true) )
  		        	yH = cont.AnyTime_height(true);
  
  		      } // if ( this.askEra )
  
  		      if ( $.browser.msie ) // IE8+ThemeUI bug!
  		    	  yW += 1;
  		      else if ( $.browser.safari ) // Safari small-text bug!
  		    	  yW += 2;
  			  yH += yBody.AnyTime_height(true);
  			  yBody.css('width',String(yW)+'px');
  			  if ( ! __msie7 ) // IE7 bug!
  				  yBody.css('height',String(yH)+'px');
  		      if ( __msie6 || __msie7 ) // IE bugs!
  		    	  title.width(yBody.outerWidth(true));
  		      yH += title.AnyTime_height(true);
  		      if ( title.AnyTime_width(true) > yW )
  		          yW = title.AnyTime_width(true);
  		      this.yDiv.css('width',String(yW)+'px');
  			  if ( ! __msie7 ) // IE7 bug!
  				  this.yDiv.css('height',String(yH)+'px');
  		
  		    } // if ( ! this.yDiv )
  		    else
  		    {
  		      this.cloak.show();
  		      this.yDiv.show();
  		    }
  		    this.pos(event);
  		    this.updYDiv(null);
  		    this.setFocus( this.yDiv.find('.AnyTime-yr-btn.AnyTime-cur-btn:first') );
  		
  		}, // .askYear()
  
  		//---------------------------------------------------------------------
  		//  .inpBlur() is called when a picker's input loses focus to dismiss
  		//  the popup.  A 1/3 second delay is necessary to restore focus if
  		//	the div is clicked (shorter delays don't always work!)  To prevent
  		//  problems cause by scrollbar focus (except in FF), focus is
  		//  force-restored if the offset div is visible. 
  		//---------------------------------------------------------------------
    
  		inpBlur: function(event)
  		{
  			if ( this.oDiv && this.oDiv.is(":visible") )
  			{
  				_this.inp.focus();
  				return;
  			}
  			this.lostFocus = true;
  		    setTimeout(
  		    	function()
  		    	{ 
  		    		if ( _this.lostFocus )
  		    		{
  		    			_this.div.find('.AnyTime-focus-btn').removeClass('AnyTime-focus-btn ui-state-focus'); 
  		    			if ( _this.pop )
  		    				_this.dismiss(event);
  		    			else
  		    				_this.ajax();
  		    		}
  		    	}, 334 );
  		},
  		
  		//---------------------------------------------------------------------
  		//  .btn() is called by AnyTime.picker() to create a <div> element
  		//  containing an <a> element.  The elements are given appropriate
  		//  classes based on the specified "classes" (an array of strings).
  		//	The specified "text" and "title" are used for the <a> element.
  		//	The "handler" is bound to click events for the <div>, which will
  		//	catch bubbling clicks from the <a> as well.  The button is
  		//	appended to the specified parent (jQuery), and the <div> jQuery
  		//	is returned.
  		//---------------------------------------------------------------------
  		
  		btn: function( parent, text, handler, classes, title )
  		{
  			var tagName = ( (parent[0].nodeName.toLowerCase()=='ul')?'li':'td'); 
  			var div$ = '<' + tagName +
  			  				' class="AnyTime-btn';
  			for ( var i = 0 ; i < classes.length ; i++ )
  				div$ += ' AnyTime-' + classes[i] + '-btn';
  			var div = $( div$ + ' ui-state-default">' + text + '</' + tagName + '>' );
  			parent.append(div);
  			div.AnyTime_title = title;
  			
  			div.click(
  			    function(e)
  			  	{
  			      // bind the handler to the picker so "this" is correct
  				  _this.tempFunc = handler;
  				  _this.tempFunc(e);
  			  	});
  			div.dblclick(
  				function(e)
  				{ 					
  					var elem = $(this);
  					if ( elem.is('.AnyTime-off-off-btn') )
  						_this.dismissODiv(e);
  					else if ( elem.is('.AnyTime-mil-btn') || elem.is('.AnyTime-cent-btn') || elem.is('.AnyTime-dec-btn') || elem.is('.AnyTime-yr-btn') || elem.is('.AnyTime-era-btn') )
  						_this.dismissYDiv(e);
  					else if ( _this.pop )
  						_this.dismiss(e); 
  				});
  		    return div;
  		
  		}, // .btn()
  	
  		//---------------------------------------------------------------------
  		//  .cleanup() destroys the DOM events and elements associated with
  		//  the picker so it can be deleted.
  		//---------------------------------------------------------------------
  	
  		cleanup: function(event)
  		{
  			this.inp.unbind('blur',this.hBlur);
  		    this.inp.unbind('click',this.hClick);
  		    this.inp.unbind('focus',this.hFocus);
  		    this.inp.unbind('keydown',this.hKeydown);
  		    this.inp.unbind('keypress',this.hKeypress);
  			this.div.remove();
  		},
  		
  		//---------------------------------------------------------------------
  		//  .dismiss() dismisses a popup picker.
  		//---------------------------------------------------------------------
  	
  		dismiss: function(event)
  		{
  			this.ajax();
  			if ( __iframe )
  				__iframe.hide();
  			if ( this.yDiv )
  				this.dismissYDiv();
  			if ( this.oDiv )
  				this.dismissODiv();
  			this.div.hide();
  			this.lostFocus = true;
  		},
  	
  		//---------------------------------------------------------------------
  		//  .dismissODiv() dismisses the UTC offset selector popover.
  		//---------------------------------------------------------------------
  	
  		dismissODiv: function(event)
  		{
  		    this.oDiv.hide();
  		    this.cloak.hide();
  			this.setFocus(this.oCur);
  		},
  	
  		//---------------------------------------------------------------------
  		//  .dismissYDiv() dismisses the date selector popover.
  		//---------------------------------------------------------------------
  	
  		dismissYDiv: function(event)
  		{
  		    this.yDiv.hide();
  		    this.cloak.hide();
  			this.setFocus(this.yCur);
  		},
  	
  		//---------------------------------------------------------------------
  		//  .setFocus() makes a specified psuedo-button appear to get focus.
  		//---------------------------------------------------------------------
  		
  		setFocus: function(btn)
  		{
  			if ( ! btn.hasClass('AnyTime-focus-btn') )
  			{
  				this.div.find('.AnyTime-focus-btn').removeClass('AnyTime-focus-btn ui-state-focus');
  				this.fBtn = btn;
  				btn.removeClass('ui-state-default ui-state-highlight');
  				btn.addClass('AnyTime-focus-btn ui-state-default ui-state-highlight ui-state-focus');
  			}
  			if ( btn.hasClass('AnyTime-off-off-btn') )
  			{
  				var oBT = this.oBody.offset().top;
  				var btnT = btn.offset().top;
  				var btnH = btn.AnyTime_height(true);
  				if ( btnT - btnH < oBT ) // move a page up
  					this.oBody.scrollTop( btnT + this.oBody.scrollTop() - ( this.oBody.innerHeight() + oBT ) + ( btnH * 2 ) );
  				else if ( btnT + btnH > oBT + this.oBody.innerHeight() ) // move a page down
  					this.oBody.scrollTop( ( btnT + this.oBody.scrollTop() ) - ( oBT + btnH ) ); 
  			}
  		},
  		  
  		//---------------------------------------------------------------------
  		//  .key() is invoked when a user presses a key while the picker's
  		//	input has focus.  A psuedo-button is considered "in focus" and an
  		//	appropriate action is performed according to the WAI-ARIA Authoring
  		//	Practices 1.0 for datepicker from
  		//  www.w3.org/TR/2009/WD-wai-aria-practices-20091215/#datepicker:
  		//
  		//  * LeftArrow moves focus left, continued to previous week.
  		//  * RightArrow moves focus right, continued to next week.
  		//  * UpArrow moves focus to the same weekday in the previous week.
  		//  * DownArrow moves focus to same weekday in the next week.
  		//  * PageUp moves focus to same day in the previous month.
  		//  * PageDown moves focus to same day in the next month.
  		//  * Shift+Page Up moves focus to same day in the previous year.
  		//  * Shift+Page Down moves focus to same day in the next year.
  		//  * Home moves focus to the first day of the month.
  		//  * End moves focus to the last day of the month.
  		//  * Ctrl+Home moves focus to the first day of the year.
  		//  * Ctrl+End moves focus to the last day of the year.
  		//  * Esc closes a DatePicker that is opened as a Popup.  
  		//
  		//  The following actions (for multiple-date selection) are NOT
  		//	supported:
  		//  * Shift+Arrow performs continous selection.  
  		//  * Ctrl+Space multiple selection of certain days.
  		//
  		//  The authoring practices do not specify behavior for a time picker,
  		//  or for month-and-year pickers that do not have a day-of-the-month,
  		//  but AnyTime.picker uses the following behavior to be as consistent
  		//  as possible with the defined datepicker functionality:
  		//  * LeftArrow moves focus left or up to previous value or field.
  		//  * RightArrow moves focus right or down to next value or field.
  		//  * UpArrow moves focus up or left to previous value or field.
  		//  * DownArrow moves focus down or right to next value or field 
  		//  * PageUp moves focus to the current value in the previous units
  		//    (for example, from ten-minutes to hours or one-minutes to
  		//	  ten-minutes or months to years).
  		//  * PageDown moves focus to the current value in the next units
  		//    (for example, from hours to ten-minutes or ten-minutes to 
  		//    one-minutes or years to months).
  		//  * Home moves the focus to the first unit button.
  		//  * End moves the focus to the last unit button.
  		//
  		//  In addition, Tab and Shift+Tab move between units (including to/
  		//	from the Day-of-Month table) and also in/out of the picker.
  		//
  		//  Because AnyTime.picker sets a value as soon as the button receives
  		//  focus, SPACE and ENTER are not needed (the WAI-ARIA guidelines use
  		//  them to select a value.
  		//---------------------------------------------------------------------
  		
  		key: function(event)
  		{
        var mo;
  			var t = null;
  			var elem = this.div.find('.AnyTime-focus-btn');
  		    var key = event.keyCode || event.which;
  		    this.denyTab = true;
  
  		    if ( key == 16 ) // Shift
  		    {
  		    }
  		    else if ( ( key == 10 ) || ( key == 13 ) || ( key == 27 ) ) // Enter & Esc
  		    {
  		      if ( this.oDiv && this.oDiv.is(':visible') )
  		        this.dismissODiv(event);
  		      else if ( this.yDiv && this.yDiv.is(':visible') )
  			    this.dismissYDiv(event);
  		      else if ( this.pop )
  			    this.dismiss(event);
  		    }
  		    else if ( ( key == 33 ) || ( ( key == 9 ) && event.shiftKey ) ) // PageUp & Shift+Tab
  		    {
  		    	if ( this.fBtn.hasClass('AnyTime-off-off-btn') )
  				{
  		    		if ( key == 9 )
  				        this.dismissODiv(event);
  				}
  		    	else if ( this.fBtn.hasClass('AnyTime-mil-btn') )
  				{
  		    		if ( key == 9 )
  				        this.dismissYDiv(event);
  				}
  		    	else if ( this.fBtn.hasClass('AnyTime-cent-btn') )
  					this.yDiv.find('.AnyTime-mil-btn.AnyTime-cur-btn').triggerHandler('click');
  		    	else if ( this.fBtn.hasClass('AnyTime-dec-btn') )
  					this.yDiv.find('.AnyTime-cent-btn.AnyTime-cur-btn').triggerHandler('click');
  		    	else if ( this.fBtn.hasClass('AnyTime-yr-btn') )
  					this.yDiv.find('.AnyTime-dec-btn.AnyTime-cur-btn').triggerHandler('click');
  		    	else if ( this.fBtn.hasClass('AnyTime-era-btn') )
  					this.yDiv.find('.AnyTime-yr-btn.AnyTime-cur-btn').triggerHandler('click');
  		    	else if ( this.fBtn.parents('.AnyTime-yrs').length )
  				{
  					if ( key == 9 )
  					{
  						this.denyTab = false;
  						return;
  					}
  				}
  		    	else if ( this.fBtn.hasClass('AnyTime-mon-btn') )
  				{
  					if ( this.dY )
  						this.yCur.triggerHandler('click');
  					else if ( key == 9 )
  					{
  						this.denyTab = false;
  						return;
  					}
  				}
  		    	else if ( this.fBtn.hasClass('AnyTime-dom-btn') )
  		    	{
  		    		if ( ( key == 9 ) && event.shiftKey ) // Shift+Tab
  					{
  						this.denyTab = false;
  						return;
  					}
  		    		else // PageUp
  		    		{
  			    		t = new Date(this.time.getTime());
  				    	if ( event.shiftKey )
  				    		t.setFullYear(t.getFullYear()-1);
  				    	else
  				    	{
  				    		mo = t.getMonth()-1;
  		    				if ( t.getDate() > __daysIn[mo] )
  		    					t.setDate(__daysIn[mo])
  			    			t.setMonth(mo);
  				    	}
  			    		this.keyDateChange(t);
  		    		}
  		    	}
  		    	else if ( this.fBtn.hasClass('AnyTime-hr-btn') )
  				{
  		    		t = this.dDoM || this.dMo;
  					if ( t )
  						t.AnyTime_clickCurrent();
  					else if ( this.dY )
  						this.yCur.triggerHandler('click');
  					else if ( key == 9 )
  					{
  						this.denyTab = false;
  						return;
  					}
  				}
  		    	else if ( this.fBtn.hasClass('AnyTime-min-ten-btn') )
  				{
  		    		t = this.dH || this.dDoM || this.dMo;
  					if ( t )
  						t.AnyTime_clickCurrent();
  					else if ( this.dY )
  						this.yCur.triggerHandler('click');
  					else if ( key == 9 )
  					{
  						this.denyTab = false;
  						return;
  					}
  				}
  		    	else if ( this.fBtn.hasClass('AnyTime-min-one-btn') )
  					this.dM.AnyTime_clickCurrent();
  		    	else if ( this.fBtn.hasClass('AnyTime-sec-ten-btn') )
  				{
  		    		if ( this.dM )
  		    			t = this.dM.find('.AnyTime-mins-ones');
  		    		else
  		    			t = this.dH || this.dDoM || this.dMo;
  					if ( t )
  						t.AnyTime_clickCurrent();
  					else if ( this.dY )
  						this.yCur.triggerHandler('click');
  					else if ( key == 9 )
  					{
  						this.denyTab = false;
  						return;
  					}
  				}
  		    	else if ( this.fBtn.hasClass('AnyTime-sec-one-btn') )
  					this.dS.AnyTime_clickCurrent();
  		    	else if ( this.fBtn.hasClass('AnyTime-off-btn') )
  				{
  		    		if ( this.dS )
  		    			t = this.dS.find('.AnyTime-secs-ones');
  		    		else if ( this.dM )
  		    			t = this.dM.find('.AnyTime-mins-ones');
  		    		else
  		    			t = this.dH || this.dDoM || this.dMo;
  					if ( t )
  						t.AnyTime_clickCurrent();
  					else if ( this.dY )
  						this.yCur.triggerHandler('click');
  					else if ( key == 9 )
  					{
  						this.denyTab = false;
  						return;
  					}
  				}
  			}
  		    else if ( ( key == 34 ) || ( key == 9 ) ) // PageDown or Tab
  		    {
  		    	if ( this.fBtn.hasClass('AnyTime-mil-btn') )
  					this.yDiv.find('.AnyTime-cent-btn.AnyTime-cur-btn').triggerHandler('click');
  		    	else if ( this.fBtn.hasClass('AnyTime-cent-btn') )
  					this.yDiv.find('.AnyTime-dec-btn.AnyTime-cur-btn').triggerHandler('click');
  		    	else if ( this.fBtn.hasClass('AnyTime-dec-btn') )
  					this.yDiv.find('.AnyTime-yr-btn.AnyTime-cur-btn').triggerHandler('click');
  		    	else if ( this.fBtn.hasClass('AnyTime-yr-btn') )
  		    	{
  		    		t = this.yDiv.find('.AnyTime-era-btn.AnyTime-cur-btn');
  					if ( t.length )
  						t.triggerHandler('click');
  					else if ( key == 9 )
  						this.dismissYDiv(event);
  		    	}
  		    	else if ( this.fBtn.hasClass('AnyTime-era-btn') )
  		    	{
  		    		if ( key == 9 )
  		    			this.dismissYDiv(event);
  		    	}
  		    	else if ( this.fBtn.hasClass('AnyTime-off-off-btn') )
  		    	{
  		    		if ( key == 9 )
  		    			this.dismissODiv(event);
  		    	}
  		    	else if ( this.fBtn.parents('.AnyTime-yrs').length )
  				{
  		    		t = this.dDoM || this.dMo || this.dH || this.dM || this.dS || this.dO; 
  					if ( t )
  						t.AnyTime_clickCurrent();
  					else if ( key == 9 )
  					{
  						this.denyTab = false;
  						return;
  					}
  				}
  		    	else if ( this.fBtn.hasClass('AnyTime-mon-btn') )
  				{
  		    		t = this.dDoM || this.dH || this.dM || this.dS || this.dO; 
  					if ( t )
  						t.AnyTime_clickCurrent();
  					else if ( key == 9 )
  					{
  						this.denyTab = false;
  						return;
  					}
  				}
  		    	else if ( this.fBtn.hasClass('AnyTime-dom-btn') )
  		    	{
  		    		if ( key == 9 ) // Tab
  		    		{
  		        		t = this.dH || this.dM || this.dS || this.dO; 
  		    			if ( t )
  							t.AnyTime_clickCurrent();
  		    			else
  						{
  							this.denyTab = false;
  							return;
  						}
  		    		}
  		    		else // PageDown
  		    		{
  			    		t = new Date(this.time.getTime());
  				    	if ( event.shiftKey )
  				    		t.setFullYear(t.getFullYear()+1);
  				    	else
  				    	{
  				    		mo = t.getMonth()+1;
  		    				if ( t.getDate() > __daysIn[mo] )
  		    					t.setDate(__daysIn[mo])
  			    			t.setMonth(mo);
  				    	}
  			    		this.keyDateChange(t);
  		    		}
  		    	}
  		    	else if ( this.fBtn.hasClass('AnyTime-hr-btn') )
  				{
  		    		t = this.dM || this.dS || this.dO; 
  					if ( t )
  						t.AnyTime_clickCurrent();
  					else if ( key == 9 )
  					{
  						this.denyTab = false;
  						return;
  					}
  				}
  		    	else if ( this.fBtn.hasClass('AnyTime-min-ten-btn') )
  		    		this.dM.find('.AnyTime-mins-ones .AnyTime-cur-btn').triggerHandler('click');
  		    	else if ( this.fBtn.hasClass('AnyTime-min-one-btn') )
  				{
  					t = this.dS || this.dO;
  					if ( t )
  						t.AnyTime_clickCurrent();
  					else if ( key == 9 )
  					{
  						this.denyTab = false;
  						return;
  					}
  				}
  		    	else if ( this.fBtn.hasClass('AnyTime-sec-ten-btn') )
  		    		this.dS.find('.AnyTime-secs-ones .AnyTime-cur-btn').triggerHandler('click');
  		    	else if ( this.fBtn.hasClass('AnyTime-sec-one-btn') )
  				{
  		    		if ( this.dO )
  						this.dO.AnyTime_clickCurrent();
  		    		else if ( key == 9 )
  					{
  						this.denyTab = false;
  						return;
  					}
  				}
  		    	else if ( this.fBtn.hasClass('AnyTime-off-btn') )
  				{
  		    		if ( key == 9 )
  					{
  						this.denyTab = false;
  						return;
  					}
  				}
  			}
  		    else if ( key == 35 ) // END
  		    {
  		    	if ( this.fBtn.hasClass('AnyTime-mil-btn') || this.fBtn.hasClass('AnyTime-cent-btn') ||
  				    this.fBtn.hasClass('AnyTime-dec-btn') || this.fBtn.hasClass('AnyTime-yr-btn') ||
  				    this.fBtn.hasClass('AnyTime-era-btn') )
  		    	{
  		    		t = this.yDiv.find('.AnyTime-ce-btn');
  		    		if ( ! t.length ) 
  		    			t = this.yDiv.find('.AnyTime-yr9-btn');
  		    		t.triggerHandler('click');
  		    	}
  		    	else if ( this.fBtn.hasClass('AnyTime-dom-btn') )
  		    	{
  		    		t = new Date(this.time.getTime());
  					t.setDate(1);
  		    		t.setMonth(t.getMonth()+1);
  					t.setDate(t.getDate()-1);
  			    	if ( event.ctrlKey )
  			    		t.setMonth(11);
  		    		this.keyDateChange(t);
  		    	}
  		    	else if ( this.dS )
  					this.dS.find('.AnyTime-sec9-btn').triggerHandler('click');
  		    	else if ( this.dM )
  					this.dM.find('.AnyTime-min9-btn').triggerHandler('click');
  				else if ( this.dH )
  					this.dH.find('.AnyTime-hr23-btn').triggerHandler('click');
  				else if ( this.dDoM )
  					this.dDoM.find('.AnyTime-dom-btn-filled:last').triggerHandler('click');
  				else if ( this.dMo )
  					this.dMo.find('.AnyTime-mon12-btn').triggerHandler('click');
  				else if ( this.dY )
  					this.yAhead.triggerHandler('click');
  		    }
  		    else if ( key == 36 ) // HOME
  		    {
  		    	if ( this.fBtn.hasClass('AnyTime-mil-btn') || this.fBtn.hasClass('AnyTime-cent-btn') ||
  				    this.fBtn.hasClass('AnyTime-dec-btn') || this.fBtn.hasClass('AnyTime-yr-btn') ||
  				    this.fBtn.hasClass('AnyTime-era-btn') )
  				{
  		    		this.yDiv.find('.AnyTime-mil0-btn').triggerHandler('click');
  		    	}
  			    else if ( this.fBtn.hasClass('AnyTime-dom-btn') )
  		    	{
  		    		t = new Date(this.time.getTime());
  					t.setDate(1);
  			    	if ( event.ctrlKey )
  			    		t.setMonth(0);
  		    		this.keyDateChange(t);
  		    	}
  				else if ( this.dY )
  					this.yCur.triggerHandler('click');
  				else if ( this.dMo )
  					this.dMo.find('.AnyTime-mon1-btn').triggerHandler('click');
  				else if ( this.dDoM )
  					this.dDoM.find('.AnyTime-dom-btn-filled:first').triggerHandler('click');
  				else if ( this.dH )
  					this.dH.find('.AnyTime-hr0-btn').triggerHandler('click');
  		    	else if ( this.dM )
  					this.dM.find('.AnyTime-min00-btn').triggerHandler('click');
  		    	else if ( this.dS )
  					this.dS.find('.AnyTime-sec00-btn').triggerHandler('click');
  		    }
  		    else if ( key == 37 ) // left arrow
  		    {
  		    	if ( this.fBtn.hasClass('AnyTime-dom-btn') )
  		    		this.keyDateChange(new Date(this.time.getTime()-__oneDay));
  		    	else
  		    		this.keyBack();
  		    }
  		    else if ( key == 38 ) // up arrow
  		    {
  		    	if ( this.fBtn.hasClass('AnyTime-dom-btn') )
  		    		this.keyDateChange(new Date(this.time.getTime()-(7*__oneDay)));
  		    	else
  		    		this.keyBack();
  		    }
  		    else if ( key == 39 ) // right arrow
  		    {
  		    	if ( this.fBtn.hasClass('AnyTime-dom-btn') )
  		    		this.keyDateChange(new Date(this.time.getTime()+__oneDay));
  		    	else
  		    		this.keyAhead();
  		    }
  		    else if ( key == 40 ) // down arrow
  		    {
  		    	if ( this.fBtn.hasClass('AnyTime-dom-btn') )
  		    		this.keyDateChange(new Date(this.time.getTime()+(7*__oneDay)));
  		    	else
  		    		this.keyAhead();
  		    }
  		    else if ( ( ( key == 86 ) || ( key == 118 ) ) && event.ctrlKey )
  		    {
  		    	this.inp.val("").change();
  		    	var _this = this;
  		    	setTimeout( function() { _this.showPkr(null); }, 100 );	
  		    	return;
  		    }
  		    else
      			this.showPkr(null);
  
  		    event.preventDefault();
  		
  		}, // .key()
  	
  		//---------------------------------------------------------------------
  		//  .keyAhead() is called by #key when a user presses the right or
  		//	down arrow.  It moves to the next appropriate button.
  		//---------------------------------------------------------------------
  		  
  		keyAhead: function()
  		{
  		   	if ( this.fBtn.hasClass('AnyTime-mil9-btn') )
  		   		this.yDiv.find('.AnyTime-cent0-btn').triggerHandler('click');
  		   	else if ( this.fBtn.hasClass('AnyTime-cent9-btn') )
  		   		this.yDiv.find('.AnyTime-dec0-btn').triggerHandler('click');
  		   	else if ( this.fBtn.hasClass('AnyTime-dec9-btn') )
  		   		this.yDiv.find('.AnyTime-yr0-btn').triggerHandler('click');
  		   	else if ( this.fBtn.hasClass('AnyTime-yr9-btn') )
  		   		this.yDiv.find('.AnyTime-bce-btn').triggerHandler('click');
  		   	else if ( this.fBtn.hasClass('AnyTime-sec9-btn') )
  		   		{}
  		   	else if ( this.fBtn.hasClass('AnyTime-sec50-btn') )
  		   		this.dS.find('.AnyTime-sec0-btn').triggerHandler('click');
  		   	else if ( this.fBtn.hasClass('AnyTime-min9-btn') )
  		   	{
  		   		if ( this.dS )
  		   			this.dS.find('.AnyTime-sec00-btn').triggerHandler('click');
  		   	}
  		   	else if ( this.fBtn.hasClass('AnyTime-min50-btn') )
  		   		this.dM.find('.AnyTime-min0-btn').triggerHandler('click');
  		   	else if ( this.fBtn.hasClass('AnyTime-hr23-btn') )
  		   	{
  		   		if ( this.dM )
  		   			this.dM.find('.AnyTime-min00-btn').triggerHandler('click');
  		   		else if ( this.dS )
  		   			this.dS.find('.AnyTime-sec00-btn').triggerHandler('click');
  		   	}
  		   	else if ( this.fBtn.hasClass('AnyTime-hr11-btn') )
  				this.dH.find('.AnyTime-hr12-btn').triggerHandler('click');
  		   	else if ( this.fBtn.hasClass('AnyTime-mon12-btn') )
  		   	{
  		   		if ( this.dDoM )
  		   			this.dDoM.AnyTime_clickCurrent();
  		   		else if ( this.dH )
  		   			this.dH.find('.AnyTime-hr0-btn').triggerHandler('click');
  		   		else if ( this.dM )
  		   			this.dM.find('.AnyTime-min00-btn').triggerHandler('click');
  		   		else if ( this.dS )
  		   			this.dS.find('.AnyTime-sec00-btn').triggerHandler('click');
  		   	}
  		   	else if ( this.fBtn.hasClass('AnyTime-yrs-ahead-btn') )
  		   	{
  		   		if ( this.dMo )
  		   			this.dMo.find('.AnyTime-mon1-btn').triggerHandler('click');
  		   		else if ( this.dH )
  		   			this.dH.find('.AnyTime-hr0-btn').triggerHandler('click');
  		   		else if ( this.dM )
  		   			this.dM.find('.AnyTime-min00-btn').triggerHandler('click');
  		   		else if ( this.dS )
  		   			this.dS.find('.AnyTime-sec00-btn').triggerHandler('click');
  		   	}
  		   	else if ( this.fBtn.hasClass('AnyTime-yr-cur-btn') )
  		        this.yNext.triggerHandler('click');
  		   	else
  				 this.fBtn.next().triggerHandler('click');
  		
  		}, // .keyAhead()
  		
  		  
  		//---------------------------------------------------------------------
  		//  .keyBack() is called by #key when a user presses the left or
  		//	up arrow. It moves to the previous appropriate button.
  		//---------------------------------------------------------------------
  		  
  		keyBack: function()
  		{
  		   	if ( this.fBtn.hasClass('AnyTime-cent0-btn') )
  		   		this.yDiv.find('.AnyTime-mil9-btn').triggerHandler('click');
  		   	else if ( this.fBtn.hasClass('AnyTime-dec0-btn') )
  		   		this.yDiv.find('.AnyTime-cent9-btn').triggerHandler('click');
  		   	else if ( this.fBtn.hasClass('AnyTime-yr0-btn') )
  		   		this.yDiv.find('.AnyTime-dec9-btn').triggerHandler('click');
  		   	else if ( this.fBtn.hasClass('AnyTime-bce-btn') )
  			   		this.yDiv.find('.AnyTime-yr9-btn').triggerHandler('click');
  		   	else if ( this.fBtn.hasClass('AnyTime-yr-cur-btn') )
  		        this.yPrior.triggerHandler('click');
  		   	else if ( this.fBtn.hasClass('AnyTime-mon1-btn') )
  		   	{
  		   		if ( this.dY )
  		   			this.yCur.triggerHandler('click');
  		   	}
  		   	else if ( this.fBtn.hasClass('AnyTime-hr0-btn') )
  		   	{
  		   		if ( this.dDoM )
  		   			this.dDoM.AnyTime_clickCurrent();
  		   		else if ( this.dMo )
  		   			this.dMo.find('.AnyTime-mon12-btn').triggerHandler('click');
  		   		else if ( this.dY )
  		   			this.yNext.triggerHandler('click');
  		   	}
  		   	else if ( this.fBtn.hasClass('AnyTime-hr12-btn') )
  		   		 this.dH.find('.AnyTime-hr11-btn').triggerHandler('click');
  		   	else if ( this.fBtn.hasClass('AnyTime-min00-btn') )
  		   	{
  		   		if ( this.dH )
  		   			this.dH.find('.AnyTime-hr23-btn').triggerHandler('click');
  		   		else if ( this.dDoM )
  		   			this.dDoM.AnyTime_clickCurrent();
  		   		else if ( this.dMo )
  		   			this.dMo.find('.AnyTime-mon12-btn').triggerHandler('click');
  		   		else if ( this.dY )
  		   			this.yNext.triggerHandler('click');
  		   	}
  		   	else if ( this.fBtn.hasClass('AnyTime-min0-btn') )
  		   		 this.dM.find('.AnyTime-min50-btn').triggerHandler('click');
  		   	else if ( this.fBtn.hasClass('AnyTime-sec00-btn') )
  		   	{
  		   		if ( this.dM )
  		   			this.dM.find('.AnyTime-min9-btn').triggerHandler('click');
  		   		else if ( this.dH )
  		   			this.dH.find('.AnyTime-hr23-btn').triggerHandler('click');
  		   		else if ( this.dDoM )
  		   			this.dDoM.AnyTime_clickCurrent();
  		   		else if ( this.dMo )
  		   			this.dMo.find('.AnyTime-mon12-btn').triggerHandler('click');
  		   		else if ( this.dY )
  		   			this.yNext.triggerHandler('click');
  		   	}
  		   	else if ( this.fBtn.hasClass('AnyTime-sec0-btn') )
  		   		 this.dS.find('.AnyTime-sec50-btn').triggerHandler('click');
  		   	else
  				 this.fBtn.prev().triggerHandler('click');
  		
  		}, // .keyBack()
  		
  		//---------------------------------------------------------------------
  		//  .keyDateChange() is called by #key when an direction key
  		//	(arrows/page/etc) is pressed while the Day-of-Month calendar has
  		//	focus. The current day is adjusted accordingly.
  		//---------------------------------------------------------------------
  		  
  		keyDateChange: function( newDate )
  		{
  			if ( this.fBtn.hasClass('AnyTime-dom-btn') )
  			{
  				this.set(newDate);
  				this.upd(null);
  				this.setFocus( this.dDoM.find('.AnyTime-cur-btn') );
  			}
  		},
  		  
  		//---------------------------------------------------------------------
  		//  .makeCloak() is called by .askOffset() and .askYear() to create
  		//  a cloak div.
  		//---------------------------------------------------------------------
  
  		makeCloak: function()
  		{
  			if ( ! this.cloak )
  			{
  		      this.cloak = $('<div class="AnyTime-cloak" style="position:absolute" />');
  		      this.div.append( this.cloak );
  		      this.cloak.click(
  		        function(e)
  		        {
  		        	if ( _this.oDiv && _this.oDiv.is(":visible") )
  		        		_this.dismissODiv(e);
  		        	else
  		        		_this.dismissYDiv(e);
  		        });
  		    }
  			else
  		      this.cloak.show();
  		},
  		
  		//---------------------------------------------------------------------
  		//  .newHour() is called when a user clicks an hour value.
  		//  It changes the date and updates the text field.
  		//---------------------------------------------------------------------
  		
  		newHour: function( event )
  		{
  		    var h;
  		    var t;
  		    var elem = $(event.target);
  		    if ( elem.hasClass("AnyTime-out-btn") )
  		    	return;
  		    if ( ! this.twelveHr )
  		      h = Number(elem.text());
  		    else
  		    {
  		      var str = elem.text();
  		      t = str.indexOf('a');
  		      if ( t < 0 )
  		      {
  		        t = Number(str.substr(0,str.indexOf('p')));
  		        h = ( (t==12) ? 12 : (t+12) );
  		      }
  		      else
  		      {
  		        t = Number(str.substr(0,t));
  		        h = ( (t==12) ? 0 : t );
  		      }
  		    }
  		    t = new Date(this.time.getTime());
  		    t.setHours(h);
  		    this.set(t);
  		    this.upd(elem);
  		    
  		}, // .newHour()
  		
  		//---------------------------------------------------------------------
  		//  .newOffset() is called when a user clicks the UTC offset (timezone)
  		//  (or +/- button) to shift the year.  It changes the date and updates
  		//  the text field.
  		//---------------------------------------------------------------------
  		
  		newOffset: function( event )
  		{
  		    if ( event.target == this.oSel[0] )
  			    this.askOffset(event);
  		    else
  		    {
  		      this.upd(this.oCur);
  		    }
  		},
  		
  		//---------------------------------------------------------------------
  		//  .newOPos() is called internally whenever a user clicks an offset
  		//  selection value.  It changes the date and updates the text field.
  		//---------------------------------------------------------------------
  		
  		newOPos: function( event )
  		{
  		    var elem = $(event.target);
              this.offMin = elem[0].AnyTime_offMin;
              this.offSI = elem[0].AnyTime_offSI;
  		    var t = new Date(this.time.getTime());
  		    this.set(t);
  		    this.updODiv(elem);
  		
  		}, // .newOPos()
  		
  		//---------------------------------------------------------------------
  		//  .newYear() is called when a user clicks a year (or one of the
  		//	"arrows") to shift the year.  It changes the date and updates the
  		//	text field.
  		//---------------------------------------------------------------------
  		
  		newYear: function( event )
  		{
  		    var elem = $(event.target);
  		    if ( elem.hasClass("AnyTime-out-btn") )
  		    	return;
  		    var txt = elem.text();
  		    if ( ( txt == '<' ) || ( txt == '&lt;' ) )
  		      this.askYear(event);
  		    else if ( ( txt == '>' ) || ( txt == '&gt;' ) )
  		      this.askYear(event);
  		    else
  		    {
  		      var t = new Date(this.time.getTime());
  		      t.setFullYear(Number(txt));
  		      this.set(t);
  		      this.upd(this.yCur);
  		    }
  		},
  		
  		//---------------------------------------------------------------------
  		//  .newYPos() is called internally whenever a user clicks a year
  		//  selection value.  It changes the date and updates the text field.
  		//---------------------------------------------------------------------
  		
  		newYPos: function( event )
  		{
  		    var elem = $(event.target);
  		    if ( elem.hasClass("AnyTime-out-btn") )
  		    	return;
  		    
  		    var era = 1;
  		    var year = this.time.getFullYear();
  		    if ( year < 0 )
  		    {
  		      era = (-1);
  		      year = 0 - year;
  		    }
  		    year = AnyTime.pad( year, 4 );
  		    if ( elem.hasClass('AnyTime-mil-btn') )
  		      year = elem.html() + year.substring(1,4);
  		    else if ( elem.hasClass('AnyTime-cent-btn') )
  		      year = year.substring(0,1) + elem.html() + year.substring(2,4);
  		    else if ( elem.hasClass('AnyTime-dec-btn') )
  		      year = year.substring(0,2) + elem.html() + year.substring(3,4);
  		    else
  		      year = year.substring(0,3) + elem.html();
  		    if ( year == '0000' )
  		      year = 1;
  		    var t = new Date(this.time.getTime());
  		    t.setFullYear( era * year );
  		    this.set(t);
  		    this.updYDiv(elem);
  		
  		}, // .newYPos()
  		
  		//---------------------------------------------------------------------
  		//  .onReady() initializes the picker after the page has loaded and,
  		//  if IE6, after the iframe has been created.
  		//---------------------------------------------------------------------
  		
  		onReady: function()
  		{
  			this.lostFocus = true;
  			if ( ! this.pop )
  				this.upd(null);
  			else 
  			{
  				if ( this.div.parent() != document.body )
  					this.div.appendTo( document.body );
  			}
  		},
  		
  		//---------------------------------------------------------------------
  		//  .pos() positions the picker, such as when it is displayed or
  		//	when the window is resized.
  		//---------------------------------------------------------------------
  		
  		pos: function(event) // note: event is ignored but this is a handler
  		{
  		    if ( this.pop )
  		    {
  		      var off = this.inp.offset();
  		      var bodyWidth = $(document.body).outerWidth(true);
  		      var pickerWidth = this.div.outerWidth(true);
  		      var left = off.left;
  		      if ( left + pickerWidth > bodyWidth - 20 )
  		        left = bodyWidth - ( pickerWidth + 20 );
  		      var top = off.top - this.div.outerHeight(true);
  		      if ( top < 0 )
  		        top = off.top + this.inp.outerHeight(true);
  		      this.div.css( { top: String(top)+'px', left: String(left<0?0:left)+'px' } );
  		    }
  		
  		    var wOff = this.div.offset();
  
  		    if ( this.oDiv && this.oDiv.is(":visible") )
  		    {
  		      var oOff = this.oLab.offset();
  		      if ( this.div.css('position') == 'absolute' )
  		      {
  		    	  oOff.top -= wOff.top;
  		          oOff.left = oOff.left - wOff.left;
  		    	  wOff = { top: 0, left: 0 };
  		      }
  		      var oW = this.oDiv.AnyTime_width(true);
  		      var wW = this.div.AnyTime_width(true);
  		      if ( oOff.left + oW > wOff.left + wW )
  		      {
  		    	  oOff.left = (wOff.left+wW)-oW;
  		    	  if ( oOff.left < 2 )
  		    		  oOff.left = 2;
  		      }
  
  		      var oH = this.oDiv.AnyTime_height(true);
  		      var wH = this.div.AnyTime_height(true);
  		      oOff.top += this.oLab.AnyTime_height(true);
  		      if ( oOff.top + oH > wOff.top + wH )
  		    	  oOff.top = oOff.top - oH;
  		      if ( oOff.top < wOff.top )
  		    	  oOff.top = wOff.top;
  
  		      this.oDiv.css( { top: oOff.top+'px', left: oOff.left+'px' } ) ;
  		    }
  
  		    else if ( this.yDiv && this.yDiv.is(":visible") )
  		    {
  		      var yOff = this.yLab.offset();
  		      if ( this.div.css('position') == 'absolute' )
  		      {
  		    	  yOff.top -= wOff.top;
  		          yOff.left = yOff.left - wOff.left;
  		    	  wOff = { top: 0, left: 0 };
  		      }
  		      yOff.left += ( (this.yLab.outerWidth(true)-this.yDiv.outerWidth(true)) / 2 );
  		      this.yDiv.css( { top: yOff.top+'px', left: yOff.left+'px' } ) ;
  		    }
  
  		    if ( this.cloak )
  			  this.cloak.css( { 
  		      	top: wOff.top+'px',
  		      	left: wOff.left+'px',
  		      	height: String(this.div.outerHeight(true)-2)+'px',
  		    	width: String(this.div.outerWidth(!$.browser.safari)-2)+'px'
  		    	} );
  		
  		}, // .pos()
  		
  		//---------------------------------------------------------------------
  		//  .set() changes the current time.  It returns true if the new
  		//	time is within the allowed range (if any).
  		//---------------------------------------------------------------------
  		
  		set: function(newTime)
  		{
  		    var t = newTime.getTime();
  		    if ( this.earliest && ( t < this.earliest ) )
  		      this.time = new Date(this.earliest);
  		    else if ( this.latest && ( t > this.latest ) )
  		      this.time = new Date(this.latest);
  		    else
  		      this.time = newTime;
  		},
  		  
  		//---------------------------------------------------------------------
  		//  .setEarliest() changes the earliest time.
  		//---------------------------------------------------------------------
  		
  		setEarliest: function(newTime)
  		{
          this.earliest = newTime;
          this.set(this.time);
  		},
  		  
  		//---------------------------------------------------------------------
  		//  .setLatest() changes the latest time.
  		//---------------------------------------------------------------------
  		
  		setLatest: function(newTime)
  		{
          this.latest = newTime;
          this.set(this.time);
  		},
  		  
  		//---------------------------------------------------------------------
  		//  .showPkr() displays the picker and sets the focus psuedo-
  		//	element. The current value in the input field is used to initialize
  		//	the picker.
  		//---------------------------------------------------------------------
  		
  		showPkr: function(event)
  		{
  			try
  		    {
  		      this.time = this.conv.parse(this.inp.val());
  		      this.offMin = this.conv.getUtcParseOffsetCaptured();
  		      this.offSI = this.conv.getUtcParseOffsetSubIndex();
  		    }
  		    catch ( e )
  		    {
  		      this.time = new Date();
  		    }
  		    this.set(this.time);
  		    this.upd(null);
  		    
  		    fBtn = null;
  		    var cb = '.AnyTime-cur-btn:first';
  		    if ( this.dDoM )
  		    	fBtn = this.dDoM.find(cb);
  			else if ( this.yCur )
  				fBtn = this.yCur;
  			else if ( this.dMo )
  				fBtn = this.dMo.find(cb);
  			else if ( this.dH )
  				fBtn = this.dH.find(cb);
  			else if ( this.dM )
  				fBtn = this.dM.find(cb);
  			else if ( this.dS )
  				fBtn = this.dS.find(cb);
  		
  		    this.setFocus(fBtn);
  		    this.pos(event);
  		
  			//  IE6 doesn't float popups over <select> elements unless an
  		    //	<iframe> is inserted between them!  So after the picker is
  		    //	made visible, move the <iframe> behind it.
  		    
  		    if ( this.pop && __iframe )
  		        setTimeout(
  		        	function()
  					{
  						var pos = _this.div.offset();
  						__iframe.css( {
  						    height: String(_this.div.outerHeight(true)) + 'px',
  						    left: String(pos.left) + 'px',
  						    position: 'absolute',
  						    top: String(pos.top) + 'px',
  						    width: String(_this.div.outerWidth(true)) + 'px'
  						    } );
  						__iframe.show();
  					}, 300 );
  		
  		}, // .showPkr()
  		
  		//---------------------------------------------------------------------
  		//  .upd() updates the picker's appearance.  It is called after
  		//	most events to make the picker reflect the currently-selected
  		//	values. fBtn is the psuedo-button to be given focus.
  		//---------------------------------------------------------------------
  		
  		upd: function(fBtn)
  		{
  		    var cmpLo = new Date(this.time.getTime());
  		    cmpLo.setMonth(0,1);
  		    cmpLo.setHours(0,0,0,0);
  		    var cmpHi = new Date(this.time.getTime());
  		    cmpHi.setMonth(11,31);
  		    cmpHi.setHours(23,59,59,999);
  
  		    //  Update year.
  		
  		    var current = this.time.getFullYear();
  		    if ( this.earliest && this.yPast )
  		    {
  				  cmpHi.setYear(current-2);
  			      if ( cmpHi.getTime() < this.earliest )
  			    	  this.yPast.addClass('AnyTime-out-btn ui-state-disabled');
  			      else
  			    	  this.yPast.removeClass('AnyTime-out-btn ui-state-disabled');
  		    }
  		    if ( this.yPrior )
  		    {
  		      this.yPrior.text(AnyTime.pad((current==1)?(-1):(current-1),4));
  		      if ( this.earliest )
  		      {
  				  cmpHi.setYear(current-1);
  			      if ( cmpHi.getTime() < this.earliest )
  			    	  this.yPrior.addClass('AnyTime-out-btn ui-state-disabled');
  			      else
  			    	  this.yPrior.removeClass('AnyTime-out-btn ui-state-disabled');
  		      }
  		    }
  		    if ( this.yCur )
  		      this.yCur.text(AnyTime.pad(current,4));
  		    if ( this.yNext )
  		    {
  		      this.yNext.text(AnyTime.pad((current==-1)?1:(current+1),4));
  		      if ( this.latest )
  		      {
  			      cmpLo.setYear(current+1);
  			      if ( cmpLo.getTime() > this.latest )
  			    	  this.yNext.addClass('AnyTime-out-btn ui-state-disabled');
  			      else
  			    	  this.yNext.removeClass('AnyTime-out-btn ui-state-disabled');
  		      }
  		    }
  		    if ( this.latest && this.yAhead )
  		    {
  				  cmpLo.setYear(current+2);
  			      if ( cmpLo.getTime() > this.latest )
  			    	  this.yAhead.addClass('AnyTime-out-btn ui-state-disabled');
  			      else
  			    	  this.yAhead.removeClass('AnyTime-out-btn ui-state-disabled');
  		    }
  		    
  		    //  Update month.
  		
  		    cmpLo.setFullYear( this.time.getFullYear() );
  		    cmpHi.setFullYear( this.time.getFullYear() );
  		    var i = 0;
  		    current = this.time.getMonth();
  		    $('#'+this.id+' .AnyTime-mon-btn').each(
  		      function()
  		      {
  		    	cmpLo.setMonth(i);
  				cmpHi.setDate(1);
  		    	cmpHi.setMonth(i+1);
  				cmpHi.setDate(0);
  		        $(this).AnyTime_current( i == current,
  		        		((!_this.earliest)||(cmpHi.getTime()>=_this.earliest)) &&
  		        		((!_this.latest)||(cmpLo.getTime()<=_this.latest)) );
  		        i++;
  		      } );
  		
  		    //  Update days.
  		
  		    cmpLo.setFullYear( this.time.getFullYear() );
  		    cmpHi.setFullYear( this.time.getFullYear() );
  		    cmpLo.setMonth( this.time.getMonth() );
  		    cmpHi.setMonth( this.time.getMonth(), 1 );
  		    current = this.time.getDate();
  		    var currentMonth = this.time.getMonth();
  		    var dow1 = cmpLo.getDay();
  		    if ( this.fDOW > dow1 )
  		      dow1 += 7;
  		    var wom = 0, dow=0;
  		    $('#'+this.id+' .AnyTime-wk').each(
  		      function()
  		      {
  		        dow = _this.fDOW;
  		        $(this).children().each(
  		          function()
  		          {
  		        	  if ( dow - _this.fDOW < 7 )
  		        	  {
  		        		  var td = $(this);
  				          if ( ((wom==0)&&(dow<dow1)) || (cmpLo.getMonth()!=currentMonth) )
  				          {
  				            td.html('&#160;');
  				            td.removeClass('AnyTime-dom-btn-filled AnyTime-cur-btn ui-state-default ui-state-highlight');
  				            td.addClass('AnyTime-dom-btn-empty');
  				            if ( wom ) // not first week
  				            {
  				            	if ( ( cmpLo.getDate() == 1 ) && ( dow != 0 ) )
  				            		td.addClass('AnyTime-dom-btn-empty-after-filled');
  				            	else
  				            		td.removeClass('AnyTime-dom-btn-empty-after-filled');
  				            	if ( cmpLo.getDate() <= 7 )
  				            		td.addClass('AnyTime-dom-btn-empty-below-filled');
  				            	else
  				            		td.removeClass('AnyTime-dom-btn-empty-below-filled');
  				                cmpLo.setDate(cmpLo.getDate()+1);
  				                cmpHi.setDate(cmpHi.getDate()+1);
  				            }
  				            else // first week
  				            {
  				            	td.addClass('AnyTime-dom-btn-empty-above-filled');
  				            	if ( dow == dow1 - 1 )
  				            		td.addClass('AnyTime-dom-btn-empty-before-filled');
  				            	else
  				            		td.removeClass('AnyTime-dom-btn-empty-before-filled');
  				            }
  				            td.addClass('ui-state-default ui-state-disabled');
  				          }
  				          else
  				          {
  				        	i = cmpLo.getDate();
  				            td.text(i);
  				            td.removeClass('AnyTime-dom-btn-empty AnyTime-dom-btn-empty-above-filled AnyTime-dom-btn-empty-before-filled '+
  				            				'AnyTime-dom-btn-empty-after-filled AnyTime-dom-btn-empty-below-filled ' +
  				            				'ui-state-default ui-state-disabled');
  				            td.addClass('AnyTime-dom-btn-filled ui-state-default');
  				            td.AnyTime_current( i == current,
  					        		((!_this.earliest)||(cmpHi.getTime()>=_this.earliest)) &&
  					        		((!_this.latest)||(cmpLo.getTime()<=_this.latest)) );
  				            cmpLo.setDate(i+1);
  				            cmpHi.setDate(i+1);
  				          }
  		        	  }
  		              dow++;
  		          } );
  		          wom++;
  		      } );
  
  		    //  Update hour.
  		
  		    cmpLo.setFullYear( this.time.getFullYear() );
  		    cmpHi.setFullYear( this.time.getFullYear() );
  		    cmpLo.setMonth( this.time.getMonth(), this.time.getDate() );
  		    cmpHi.setMonth( this.time.getMonth(), this.time.getDate() );
  		    var not12 = ! this.twelveHr;
          var hr = this.time.getHours();
  		    $('#'+this.id+' .AnyTime-hr-btn').each(
  		      function()
  		      {
  		    	var html = this.innerHTML;
  		    	var i;
  		    	if ( not12 )
  		    		i = Number(html);
  		    	else
  		    	{
  			    	i = Number(html.substring(0,html.length-2) );
  		    		if ( html.charAt(html.length-2) == 'a' )
  		    		{
  		    			if ( i == 12 )
  		    				i = 0;
  		    		}
  		    		else if ( i < 12 )
  		    			i += 12;
  		    	}
                  cmpLo.setHours(i);
                  cmpHi.setHours(i);
              $(this).AnyTime_current( hr == i,
  		        	((!_this.earliest)||(cmpHi.getTime()>=_this.earliest)) &&
  		        		((!_this.latest)||(cmpLo.getTime()<=_this.latest)) );
              if ( i < 23 )
  		          cmpLo.setHours( cmpLo.getHours()+1 );
  		      } );
  		
  		    //  Update minute.
  		
          cmpLo.setHours( this.time.getHours() );
          cmpHi.setHours( this.time.getHours() );
  		    var units = this.time.getMinutes();
  		    var tens = String(Math.floor(units/10));
  		    var ones = String(units % 10);
  		    $('#'+this.id+' .AnyTime-min-ten-btn:not(.AnyTime-min-ten-btn-empty)').each(
  		      function()
  		      {
  		        $(this).AnyTime_current( this.innerHTML == tens,
  		        		((!_this.earliest)||(cmpHi.getTime()>=_this.earliest)) &&
  		        		((!_this.latest)||(cmpLo.getTime()<=_this.latest)) );
              if ( cmpLo.getMinutes() < 50 )
              {
  		        cmpLo.setMinutes( cmpLo.getMinutes()+10 );
  		        cmpHi.setMinutes( cmpHi.getMinutes()+10 );
              }
  		      } );
  		    cmpLo.setMinutes( Math.floor(this.time.getMinutes()/10)*10 );
  		    cmpHi.setMinutes( Math.floor(this.time.getMinutes()/10)*10 );
  		    $('#'+this.id+' .AnyTime-min-one-btn:not(.AnyTime-min-one-btn-empty)').each(
  		      function()
  		      {
  		        $(this).AnyTime_current( this.innerHTML == ones,
  		        		((!_this.earliest)||(cmpHi.getTime()>=_this.earliest)) &&
  		        		((!_this.latest)||(cmpLo.getTime()<=_this.latest)) );
  		        cmpLo.setMinutes( cmpLo.getMinutes()+1 );
  		        cmpHi.setMinutes( cmpHi.getMinutes()+1 );
  		      } );
  		
  		    //  Update second.
  		
  		    cmpLo.setMinutes( this.time.getMinutes() );
  		    cmpHi.setMinutes( this.time.getMinutes() );
  		    units = this.time.getSeconds();
  		    tens = String(Math.floor(units/10));
  		    ones = String(units % 10);
  		    $('#'+this.id+' .AnyTime-sec-ten-btn:not(.AnyTime-sec-ten-btn-empty)').each(
  		      function()
  		      {
  		        $(this).AnyTime_current( this.innerHTML == tens,
  		        		((!_this.earliest)||(cmpHi.getTime()>=_this.earliest)) &&
  		        		((!_this.latest)||(cmpLo.getTime()<=_this.latest)) );
              if ( cmpLo.getSeconds() < 50 )
              {
  		        cmpLo.setSeconds( cmpLo.getSeconds()+10 );
  		        cmpHi.setSeconds( cmpHi.getSeconds()+10 );
              }
  		      } );
  		    cmpLo.setSeconds( Math.floor(this.time.getSeconds()/10)*10 );
  		    cmpHi.setSeconds( Math.floor(this.time.getSeconds()/10)*10 );
  		    $('#'+this.id+' .AnyTime-sec-one-btn:not(.AnyTime-sec-one-btn-empty)').each(
  		      function()
  		      {
  		        $(this).AnyTime_current( this.innerHTML == ones,
  		        		((!_this.earliest)||(cmpHi.getTime()>=_this.earliest)) &&
  		        		((!_this.latest)||(cmpLo.getTime()<=_this.latest)) );
  		        cmpLo.setSeconds( cmpLo.getSeconds()+1 );
  		        cmpHi.setSeconds( cmpHi.getSeconds()+1 );
  		      } );
  
  		    //  Update offset (time zone).
  
  		    if ( this.oConv )
  		    {
  			    this.oConv.setUtcFormatOffsetAlleged(this.offMin);
  			    this.oConv.setUtcFormatOffsetSubIndex(this.offSI);
  			    var tzs = this.oConv.format(this.time);
  			    this.oCur.html( tzs );
  		    }
  
  		    //	Set the focus element, then size the picker according to its
  		    //	components, show the changes, and invoke Ajax if desired.
  		    
  		    if ( fBtn )
  		    	this.setFocus(fBtn);
  		
              this.conv.setUtcFormatOffsetAlleged(this.offMin);
  		    this.conv.setUtcFormatOffsetSubIndex(this.offSI);
  		    this.inp.val(this.conv.format(this.time)).change();
  		    this.div.show();
  		
  		    var d, totH = 0, totW = 0, dYW = 0, dMoW = 0, dDoMW = 0;
  		    if ( this.dY )
  		    {
  		    	totW = dYW = this.dY.outerWidth(true);
  				totH = this.yLab.AnyTime_height(true) + this.dY.AnyTime_height(true);
  		    }
  		    if ( this.dMo )
  		    {
  		    	dMoW = this.dMo.outerWidth(true);
  		    	if ( dMoW > totW )
  		    		totW = dMoW;
  		    	totH += this.hMo.AnyTime_height(true) + this.dMo.AnyTime_height(true);
  		    }
  		    if ( this.dDoM )
  		    {
  			    dDoMW = this.dDoM.outerWidth(true);
  			    if ( dDoMW > totW )
  			    	totW = dDoMW;
  			    if ( __msie6 || __msie7 )
  			    {
  			    	if ( dMoW > dDoMW )
  			    		this.dDoM.css('width',String(dMoW)+'px');
  			    	else if ( dYW > dDoMW )
  			    		this.dDoM.css('width',String(dYW)+'px');
  			    }
  			    totH += this.hDoM.AnyTime_height(true) + this.dDoM.AnyTime_height(true);
  		    }
  		    if ( this.dD )
  		    {
  		    	this.dD.css( { width:String(totW)+'px', height:String(totH)+'px' } );
  		        totW += this.dMinW;
  		        totH += this.dMinH;
  		    }
  		
  		    var w = 0, h = 0, timeH = 0, timeW = 0;
  		    if ( this.dH )
  		    {
  		    	w = this.dH.outerWidth(true);
  		    	timeW += w + 1;
  		    	h = this.dH.AnyTime_height(true);
  		    	if ( h > timeH )
  		    		timeH = h;
  		    }
  		    if ( this.dM )
  		    {
  		        w = this.dM.outerWidth(true);
  		        timeW += w + 1;
  		        h = this.dM.AnyTime_height(true);
  		        if ( h > timeH )
  		        	timeH = h;
  		    }
  		    if ( this.dS )
  		    {
  		        w = this.dS.outerWidth(true);
  		        timeW += w + 1;
  		        h = this.dS.AnyTime_height(true);
  		        if ( h > timeH )
  		        	timeH = h;
  		    }
  		    if ( this.dO )
  		    {
  		        w = this.oMinW;
  		        if ( timeW < w+1 )
  		        	timeW = w+1;
  		        timeH += this.dO.AnyTime_height(true);
  		    }
  		    if ( this.dT )
  		    {
  		    	this.dT.css( { width:String(timeW)+'px', height:String(timeH)+'px' } );
  		    	timeW += this.tMinW + 1;
  		        timeH += this.tMinH;
  		    	totW += timeW;
  		    	if ( timeH > totH )
  		    		totH = timeH;
  			    if ( this.dO ) // stretch offset button if possible
  			    {
  			    	var dOW = this.dT.width()-(this.oMinW+1);
  			    	this.dO.css({width:String(dOW)+"px"});
  			    	this.oCur.css({width:String(dOW-(this.oListMinW+4))+"px"});
  			    }
  		    }
  		    	
  		    this.dB.css({height:String(totH)+'px',width:String(totW)+'px'});
  		
  		    totH += this.bMinH;
  		    totW += this.bMinW;
  		    totH += this.hTitle.AnyTime_height(true) + this.wMinH;
  		    totW += this.wMinW;
  		    if ( this.hTitle.outerWidth(true) > totW )
  		        totW = this.hTitle.outerWidth(true); // IE quirk
  		    this.div.css({height:String(totH)+'px',width:String(totW)+'px'});
  		
  		    if ( ! this.pop )
  		      this.ajax();
  		
  		}, // .upd()
  		
  		//---------------------------------------------------------------------
  		//  .updODiv() updates the UTC offset selector's appearance.  It is
  		//	called after most events to make the picker reflect the currently-
  		//	selected values. fBtn is the psuedo-button to be given focus.
  		//---------------------------------------------------------------------
  		
  		updODiv: function(fBtn)
  		{
              var cur, matched = false, def = null;
  		    this.oDiv.find('.AnyTime-off-off-btn').each(
  		      function()
  		      {
  		    	  if ( this.AnyTime_offMin == _this.offMin )
  		    	  {
  		    		  if ( this.AnyTime_offSI == _this.offSI )
  		    			  $(this).AnyTime_current(matched=true,true);
  		    		  else
  		    	      {
  		    			  $(this).AnyTime_current(false,true);
  		    			  if ( def == null )
  			    			  def = $(this);
  		    	      }
  		    	  }
  		    	  else
  	    			  $(this).AnyTime_current(false,true);
  		      } );
  		    if ( ( ! matched ) && ( def != null ) )
  		    	def.AnyTime_current(true,true);
  		
  		    //  Show change
  		
              this.conv.setUtcFormatOffsetAlleged(this.offMin);
              this.conv.setUtcFormatOffsetSubIndex(this.offSI);
  		    this.inp.val(this.conv.format(this.time)).change();
  		    this.upd(fBtn);
  		
  		}, // .updODiv()
  
  		//---------------------------------------------------------------------
  		//  .updYDiv() updates the year selector's appearance.  It is
  		//	called after most events to make the picker reflect the currently-
  		//	selected values. fBtn is the psuedo-button to be given focus.
  		//---------------------------------------------------------------------
  		
  		updYDiv: function(fBtn)
  		{
  		    var i, legal;
  			var era = 1;
  		    var yearValue = this.time.getFullYear();
  		    if ( yearValue < 0 )
  		    {
  		      era = (-1);
  		      yearValue = 0 - yearValue;
  		    }
  		    yearValue = AnyTime.pad( yearValue, 4 );
  		    var eY = _this.earliest && new Date(_this.earliest).getFullYear();
  		    var lY = _this.latest && new Date(_this.latest).getFullYear();
  	    
  		    i = 0;
  		    this.yDiv.find('.AnyTime-mil-btn').each(
  		      function()
  		      {
  		    	legal = ( ((!_this.earliest)||(era*(i+(era<0?0:999))>=eY)) && ((!_this.latest)||(era*(i+(era>0?0:999))<=lY)) );
  		        $(this).AnyTime_current( this.innerHTML == yearValue.substring(0,1), legal );
  		        i += 1000;
  		      } );
  
  		    i = (Math.floor(yearValue/1000)*1000);
  		    this.yDiv.find('.AnyTime-cent-btn').each(
  		      function()
  		      {
  			    	legal = ( ((!_this.earliest)||(era*(i+(era<0?0:99))>=eY)) && ((!_this.latest)||(era*(i+(era>0?0:99))<=lY)) );
  		        $(this).AnyTime_current( this.innerHTML == yearValue.substring(1,2), legal );
  		        i += 100;
  		      } );
  
  		    i = (Math.floor(yearValue/100)*100);
  		    this.yDiv.find('.AnyTime-dec-btn').each(
  		      function()
  		      {
  			    	legal = ( ((!_this.earliest)||(era*(i+(era<0?0:9))>=eY)) && ((!_this.latest)||(era*(i+(era>0?0:9))<=lY)) );
  		        $(this).AnyTime_current( this.innerHTML == yearValue.substring(2,3), legal );
  		        i += 10;
  		      } );
  
  		    i = (Math.floor(yearValue/10)*10);
  		    this.yDiv.find('.AnyTime-yr-btn').each(
  		      function()
  		      {
  			    legal = ( ((!_this.earliest)||(era*i>=eY)) && ((!_this.latest)||(era*i<=lY)) );
  		        $(this).AnyTime_current( this.innerHTML == yearValue.substring(3), legal );
  		        i += 1;
  	          } );
  		    
  		    this.yDiv.find('.AnyTime-bce-btn').each(
  		      function()
  		      {
  		    	  $(this).AnyTime_current( era < 0, (!_this.earliest) || ( _this.earliest < 0 ) );
  		      } );
  		    this.yDiv.find('.AnyTime-ce-btn').each(
  		      function()
  		      {
  		    	$(this).AnyTime_current( era > 0, (!_this.latest) || ( _this.latest > 0 ) );
  		      } );
  		
  		    //  Show change
  		
              this.conv.setUtcFormatOffsetAlleged(this.offMin);
              this.conv.setUtcFormatOffsetSubIndex(this.offSI);
  		    this.inp.val(this.conv.format(this.time)).change();
  		    this.upd(fBtn);
  		
  		} // .updYDiv()
  
  	}; // __pickers[id] = ...
  	__pickers[id].initialize(id);
  	
  } // AnyTime.picker = 
  
  //=============================================================================
  //  AnyTime.setEarliest()
  //
  //  Updates the earliest date/time for the picker attached to a specified
  //  text field.
  //=============================================================================
  
  AnyTime.setEarliest = function( id, newTime )
  {
    __pickers[id].setEarliest(newTime)
  };
  
  
  //=============================================================================
  //  AnyTime.setLatest()
  //
  //  Updates the latest date/time for the picker attached to a specified
  //  text field.
  //=============================================================================
  
  AnyTime.setLatest = function( id, newTime )
  {
    __pickers[id].setLatest(newTime)
  };
  
  
  })(jQuery); // function($)...
  
  
  //
  //  END OF FILE
  //
  //if(window.location.hostname.length&&(window.location.hostname!='www.ama3.com')&&(window.location.hostname!='dev2.ama3.com'))alert('REMOVE THE LAST LINE FROM anytime.js!');
  