YAHOO.util.Event.onDOMReady(function () {

    /* BetterCalendar Widget, with footer! */
    YAHOO.widget.BetterCalendar = function(id, el, userConfig) {
      if (arguments.length > 0) {

          YAHOO.widget.BetterCalendar.superclass.constructor.call(this, id, el, userConfig);

      }      
    };

    /* function to select year from options */
    YAHOO.lang.extend(YAHOO.widget.BetterCalendar, YAHOO.widget.Calendar, 
    {
        init : function(id, el, userConfig)
        {
          YAHOO.widget.BetterCalendar.superclass.init.call(this, id, el, userConfig);
        },
        
        renderFooter : function(html)
        {
          var defCfg = YAHOO.widget.Calendar._DEFAULT_CONFIG;
          
          /* head */
          html[html.length] = '<tfoot><tr><td colspan="7">'

          var css_base = "/stylesheets/yui/";

          /* left arrow */
          html[html.length] = '<a class="calnavyearleft"><img src="'+ css_base + 'callt.gif"></a>';          


          /* select box, take into account min/max year.. */
          html[html.length] = '<select class="calnavyearselect">';

          min = this.cfg.getProperty(defCfg.MINDATE.key);
          min_date = (100).years().ago().getFullYear();
          if(min)
          {
            min_date = min.getFullYear();
          }
          
          max = this.cfg.getProperty(defCfg.MAXDATE.key);
          max_date = (100).years().fromNow().getFullYear();
          if(max)
          {
            max_date = max.getFullYear();
          }

          var pageYear = this.cfg.getProperty(defCfg.PAGEDATE.key).getFullYear();
          
          for(i = min_date; i <= max_date; i++)
          {
            var date_selected = ''
            if(i == pageYear)
            {
              date_selected = 'selected="selected"';
            }
            html[html.length] = '<option '+date_selected+' value="'+i+'">'+i+'</option>';
          }

          html[html.length] = '</select>';

          /* right arrow */
          html[html.length] = '<a class="calnavyearright"><img src="'+ css_base + 'calrt.gif"></a>';          
          
          /* end */
          html[html.length] = '</td></tr></tfoot>';
          return html;
          
        }, /* end render footer */
        
        applyListeners : function()
        {
          YAHOO.widget.BetterCalendar.superclass.applyListeners.call(this);

		      var cal = this.parent || this;

          var yearLeft   = YAHOO.util.Dom.getElementsByClassName("calnavyearleft",   "a",      this.oDomContainer);
          var yearRight  = YAHOO.util.Dom.getElementsByClassName("calnavyearright",  "a",      this.oDomContainer);          
          var yearSelect = YAHOO.util.Dom.getElementsByClassName("calnavyearselect", "select", this.oDomContainer);                    

          var switch_year = function(e){this.setYear(parseInt(YAHOO.util.Event.getTarget(e).value)); this.render();}

          YAHOO.util.Event.addListener(yearLeft,   "mousedown", cal.previousYear, cal, true);
          YAHOO.util.Event.addListener(yearRight,  "mousedown", cal.nextYear,     cal, true);
          YAHOO.util.Event.addListener(yearSelect, "change",    switch_year,      cal, true);
        }
    }); /* end extend */

    /* Create the Div Element the calendar will be stored in */
    var cal_div = document.createElement( "div" );
    cal_div.id = "calplaceholder";
    document.body.appendChild( cal_div );
    
    /* Create div to hold hidden button (until can reuse mousedown events) */
    var btn_div = document.createElement( "div" );
    btn_div.id = "buttonholder";
    $(btn_div).hide();
    document.body.appendChild( btn_div );


    /* make calendar and overlay.. attach to button */
    oCalendarOverlay = new YAHOO.widget.Overlay("calendaroverlay", { visible: false });
    oCalendarOverlay.setBody("&#32;");
    oCalendarOverlay.body.id = "calendarcontainer";
    oCalendarOverlay.render('calplaceholder');

    oCalendar = new YAHOO.widget.BetterCalendar("buttoncalendar", oCalendarOverlay.body.id);
    oCalendar.cfg.setProperty("MDY_YEAR_POSITION", 1);
    oCalendar.cfg.setProperty("MDY_MONTH_POSITION", 2);
    oCalendar.cfg.setProperty("MDY_DAY_POSITION", 3);      
    oCalendar.render();

    oButton1 = new YAHOO.widget.Button({container: 'buttonholder', id: 'calendar_button', type: 'menu', menu: oCalendarOverlay});    
    
    oCalendar.changePageEvent.subscribe(function ()
    {
      window.setTimeout(function () { oCalendarOverlay.show(); }, 0);
    });
    
    oCalendar.selectEvent.subscribe(function (p_sType, p_aArgs)
    {
      var aDate;
      if (p_aArgs) {
        aDate = p_aArgs[0][0];
        $(cur_field).value = oCalendar.getSelectedDates().first().toString('yyyy-MM-dd');
      }
      oCalendarOverlay.hide();
    });    
    
    
}); /* on dom ready */


/* function that takes care of popping up calendars */
var pop_cal = function(dom_id, yui_options)
{
  cur_field = dom_id;
  
  var date_obj = Date.parse($(dom_id).value);
  if(date_obj)
  {
    var new_date_str = date_obj.getFullYear() + "/" + (date_obj.getMonth()+1) + "/" + date_obj.getDate();
    oCalendar.cfg.setProperty('selected', new_date_str);
    oCalendar.cfg.setProperty('pagedate', date_obj, true);
  }      
  else
  {
    oCalendar.cfg.setProperty('selected', '');
    oCalendar.cfg.setProperty('pagedate', Date.today(), true);
  }
  
  oCalendar.cfg.setProperty('mindate', yui_options["mindate"]);
  oCalendar.cfg.setProperty('maxdate', yui_options["maxdate"]);  
  
  oCalendar.render();

  oCalendarOverlay.cfg.setProperty('context', [$(dom_id), 'tl', 'bl']);
  oCalendarOverlay.show();
  
  var bMenuFlipped = false;
  var nDisplayRegionHeight = bcgetMenuDisplayRegionHeight(bMenuFlipped);
  var nMenuHeight = oCalendarOverlay.element.offsetHeight;

  if (nDisplayRegionHeight < nMenuHeight) {
    oCalendarOverlay.align("bl", "tl");

    bMenuFlipped = true;
    nDisplayRegionHeight = bcgetMenuDisplayRegionHeight(bMenuFlipped);

    if (nDisplayRegionHeight < nMenuHeight) {
      oCalendarOverlay.align("tl", "bl");
    }
  }
}

/* stolen from yui to help place above/below */
var bcgetMenuDisplayRegionHeight = function(bMenuFlipped) {
    var Dom             = YAHOO.util.Dom;
    var alignEL         = $(cur_field);
    var nViewportOffset = YAHOO.widget.Overlay.VIEWPORT_OFFSET;
    var nButtonY        = Dom.getY(alignEL);
    var nScrollTop      = Dom.getDocumentScrollTop();

    if (nScrollTop) {
        nButtonY = nButtonY - nScrollTop;
    }
    
    var nTopRegion    = nButtonY;
    var nBottomRegion = (Dom.getViewportHeight() - (nButtonY + alignEL.offsetHeight));

    if (bMenuFlipped)
    {
      return (nTopRegion - nViewportOffset);
    }
    else
    {
      return (nBottomRegion - nViewportOffset);
    }
}
