/**
 * The ButvCalendar
 *
 * @extends YAHOO.widget.Calendar
 * @constructor
 * @param id
 * @param containerId 
 * @param config
 */
 
 YAHOO.widget.ButvCalendar = function(id, containerId, config) {
	this.init(id, containerId, config);
};

YAHOO.extend(YAHOO.widget.ButvCalendar, YAHOO.widget.Calendar, {
  render: function() {
    this.beforeRenderEvent.fire();
    
    // Find starting day of the current month
    var workingDate = YAHOO.widget.DateMath.findMonthStart(this.cfg.getProperty("pagedate"));
    
    this.resetRenderers();
    this.cellDates.length = 0;
    
    YAHOO.util.Event.purgeElement(this.oDomContainer, true);
    
    var html = [];
    
    html[html.length] = '<table width="243" border="0" cellspacing="0" cellpadding="0" id="' + this.id + '" style="margin-left:10px;margin-right:10px;">';
    html = this.renderHeader(html);
    html[html.length] = '<tr>';
    html[html.length] = '<td align="center" valign="top" bgcolor="#FFFFFF"><table border="0" cellspacing="1" cellpadding="0">';
    if (this.cfg.getProperty("SHOW_WEEKDAYS")) {
      html = this.buildWeekdays(html);
    }
    html = this.renderBody(workingDate, html);
    html[html.length] = '</table></td>';
    html[html.length] = '</tr>';
    html = this.renderFooter(html);
    html[html.length] = '</table>';
    
    this.oDomContainer.innerHTML = html.join("\n");
    
    this.applyListeners();
    this.cells = this.oDomContainer.getElementsByTagName("td");
    
    this.cfg.refireEvent("title");
    this.cfg.refireEvent("close");
    this.cfg.refireEvent("iframe");
    
    this.renderEvent.fire();
  },
  renderHeader: function(html) {
    var colSpan = 9;
    
    var DEPR_NAV_LEFT = "us/tr/callt.gif";
    var DEPR_NAV_RIGHT = "us/tr/calrt.gif"; 
    
    if (this.cfg.getProperty("SHOW_WEEK_HEADER")) {
      colSpan += 1;
    }
  
    if (this.cfg.getProperty("SHOW_WEEK_FOOTER")) {
      colSpan += 1;
    }
    
    var renderLeft, renderRight = false;
  
    if (this.parent) {
      if (this.index === 0) {
        renderLeft = true;
      }
      if (this.index == (this.parent.cfg.getProperty("pages") -1)) {
        renderRight = true;
      }
    } else {
      renderLeft = true;
      renderRight = true;
    }
  
    var cal = this.parent || this;
    
    html[html.length] = "<tr>";
    html[html.length] =   "<td align=\"center\" class=\"year\" style=\"padding-bottom:4px;\">";
    if (renderLeft) {
      html[html.length] = '<a class="' + this.Style.CSS_NAV_LEFT + '"><img src=\"http://businesstv.chosun.com/images/200801/prev.jpg\" width=\"12\" height=\"11\" border=\"0\" style=\"margin-right:12px;cursor:hand;\"></a>';
    }
    html[html.length] =         "<font color=\"#EE312F\">" + this.buildMonthLabel() + "</font>";
    if (renderLeft) {
      html[html.length] = '<a class="' + this.Style.CSS_NAV_RIGHT + '"><img src=\"http://businesstv.chosun.com/images/200801/next.jpg\" width=\"12\" height=\"11\" border=\"0\" style=\"margin-left:12px;cursor:hand;\"></a>';
    }
    html[html.length] =   "</td>";
    html[html.length] = "</tr>";
	html[html.length] = "<tr>";
	html[html.length] = "	<td><img src=\"http://businesstv.chosun.com/images/200801/calendar_bgT.gif\" width=\"243\" height=\"4\"></td>";
	html[html.length] = "</tr>";
    
    return html;
  },
  renderBody: function(workingDate, html) {
    var startDay = this.cfg.getProperty("START_WEEKDAY");
  
    this.preMonthDays = workingDate.getDay();
    if (startDay > 0) {
      this.preMonthDays -= startDay;
    }
    if (this.preMonthDays < 0) {
      this.preMonthDays += 7;
    }
    
    this.monthDays = YAHOO.widget.DateMath.findMonthEnd(workingDate).getDate();
    this.postMonthDays = YAHOO.widget.Calendar.DISPLAY_DAYS-this.preMonthDays-this.monthDays;
    
    workingDate = YAHOO.widget.DateMath.subtract(workingDate, YAHOO.widget.DateMath.DAY, this.preMonthDays);
  
    var useDate,weekNum,weekClass;
    useDate = this.cfg.getProperty("pagedate");
  
    var i = 0;
  
    var tempDiv = document.createElement("div");
    var cell = document.createElement("td");
    tempDiv.appendChild(cell);
  
    var jan1 = new Date(useDate.getFullYear(),0,1);
  
    var cal = this.parent || this;
  
    for (var r=0;r<6;r++) {
  
      weekNum = YAHOO.widget.DateMath.getWeekNumber(workingDate, useDate.getFullYear(), startDay);
  
      weekClass = "w" + weekNum;
  
      if (r !== 0 && this.isDateOOM(workingDate) && this.cfg.getProperty("HIDE_BLANK_WEEKS") === true) {
        break;
      } else {
        html[html.length] = "<tr>";
        html[html.length] =   "<td width=\"1\"></td>";
        
        if (this.cfg.getProperty("SHOW_WEEK_HEADER")) { html = this.renderRowHeader(weekNum, html); }
        
        for (var d=0;d<7;d++){ // Render actual days
          var cellRenderers = [];

          this.clearElement(cell);
          
          cell.setAttribute("align", "center");
          YAHOO.util.Dom.addClass(cell, "day_s");
  
          cell.id = this.id + "_cell" + i;
          
          cell.innerHTML = i;
  
          var renderer = null;
          
          if (workingDate.getFullYear() == this.today.getFullYear() &&
            workingDate.getMonth()    == this.today.getMonth() &&
            workingDate.getDate()   == this.today.getDate()) {
            cellRenderers[cellRenderers.length]=cal.renderCellStyleToday;
          }
          
          this.cellDates[this.cellDates.length]=[workingDate.getFullYear(),workingDate.getMonth()+1,workingDate.getDate()]; // Add this date to cellDates
                
          if (this.isDateOOM(workingDate)) {
            cellRenderers[cellRenderers.length]=cal.renderCellNotThisMonth;
          } else {
            YAHOO.util.Dom.addClass(cell, "wd" + workingDate.getDay());
            YAHOO.util.Dom.addClass(cell, "d" + workingDate.getDate());
          
            for (var s=0;s<this.renderStack.length;++s) {
  
              var rArray = this.renderStack[s];
              var type = rArray[0];
              
              var month;
              var day;
              var year;
              
              switch (type) {
                case YAHOO.widget.Calendar.DATE:
                  month = rArray[1][1];
                  day = rArray[1][2];
                  year = rArray[1][0];
  
                  if (workingDate.getMonth()+1 == month && workingDate.getDate() == day && workingDate.getFullYear() == year) {
                    renderer = rArray[2];
                    this.renderStack.splice(s,1);
                  }
                  break;
                case YAHOO.widget.Calendar.MONTH_DAY:
                  month = rArray[1][0];
                  day = rArray[1][1];
                  
                  if (workingDate.getMonth()+1 == month && workingDate.getDate() == day) {
                    renderer = rArray[2];
                    this.renderStack.splice(s,1);
                  }
                  break;
                case YAHOO.widget.Calendar.RANGE:
                  var date1 = rArray[1][0];
                  var date2 = rArray[1][1];
  
                  var d1month = date1[1];
                  var d1day = date1[2];
                  var d1year = date1[0];
                  
                  var d1 = new Date(d1year, d1month-1, d1day);
  
                  var d2month = date2[1];
                  var d2day = date2[2];
                  var d2year = date2[0];
  
                  var d2 = new Date(d2year, d2month-1, d2day);
  
                  if (workingDate.getTime() >= d1.getTime() && workingDate.getTime() <= d2.getTime()) {
                    renderer = rArray[2];
  
                    if (workingDate.getTime()==d2.getTime()) { 
                      this.renderStack.splice(s,1);
                    }
                  }
                  break;
                case YAHOO.widget.Calendar.WEEKDAY:
                  
                  var weekday = rArray[1][0];
                  if (workingDate.getDay()+1 == weekday) {
                    renderer = rArray[2];
                  }
                  break;
                case YAHOO.widget.Calendar.MONTH:
                  
                  month = rArray[1][0];
                  if (workingDate.getMonth()+1 == month) {
                    renderer = rArray[2];
                  }
                  break;
              }
              
              if (renderer) {
                cellRenderers[cellRenderers.length]=renderer;
              }
            }
          }
  
          if (this._indexOfSelectedFieldArray([workingDate.getFullYear(),workingDate.getMonth()+1,workingDate.getDate()]) > -1) {
            cellRenderers[cellRenderers.length]=cal.renderCellStyleSelected; 
          }
  
          var mindate = this.cfg.getProperty("mindate");
          var maxdate = this.cfg.getProperty("maxdate");
  
          if (mindate) {
            mindate = YAHOO.widget.DateMath.clearTime(mindate);
          }
          if (maxdate) {
            maxdate = YAHOO.widget.DateMath.clearTime(maxdate);
          }
  
          if (
            (mindate && (workingDate.getTime() < mindate.getTime())) ||
            (maxdate && (workingDate.getTime() > maxdate.getTime()))
          ) {
            cellRenderers[cellRenderers.length]=cal.renderOutOfBoundsDate;
          } else {
            cellRenderers[cellRenderers.length]=cal.styleCellDefault;
            cellRenderers[cellRenderers.length]=cal.renderCellDefault;  
          }
  
          for (var x=0;x<cellRenderers.length;++x) {
            var ren = cellRenderers[x];
            if (ren.call((this.parent || this),workingDate,cell) == YAHOO.widget.Calendar.STOP_RENDER) {
              break;
            }
          }
  
          workingDate.setTime(workingDate.getTime() + YAHOO.widget.DateMath.ONE_DAY_MS);
  
          if (i >= 0 && i <= 6) {
            YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_TOP);
          }
          if ((i % 7) === 0) {
            YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_LEFT);
          }
          if (((i+1) % 7) === 0) {
            YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_RIGHT);
          }
          
          var postDays = this.postMonthDays; 
          if (postDays >= 7 && this.cfg.getProperty("HIDE_BLANK_WEEKS")) {
            var blankWeeks = Math.floor(postDays/7);
            for (var p=0;p<blankWeeks;++p) {
              postDays -= 7;
            }
          }
          
          if (i >= ((this.preMonthDays+postDays+this.monthDays)-7)) {
            YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_BOTTOM);
          }
  
          html[html.length] = tempDiv.innerHTML;
          
          i++;
        }
  
        if (this.cfg.getProperty("SHOW_WEEK_FOOTER")) { html = this.renderRowFooter(weekNum, html); }
  
        html[html.length] =   "<td width=\"1\"></td>";
        html[html.length] = "</tr>";
      }
    }

    return html;
  },
  renderFooter: function(html) {
    html[html.length] = '<tr>';
    html[html.length] =   '<td><img src="http://businesstv.chosun.com/images/200801/calendar_bgB.gif" width="243" height="4"></td>';
    html[html.length] = '</tr>';
    return html;
  },
  buildMonthLabel: function() {
    var text =  this.cfg.getProperty("pagedate").getFullYear() + "년 " + this.Locale.LOCALE_MONTHS[this.cfg.getProperty("pagedate").getMonth()];
    return text;
  },
  buildWeekdays: function(html) {
    html[html.length] = '<tr>';
    html[html.length] =   '<td colspan="9" style="padding:2px 0px 3px 0px;"><img src="http://businesstv.chosun.com/images/200801/calendar_day.gif"></td>';
    html[html.length] = '</tr>';
    return html;
  },
  renderCellDefault: function(workingDate, cell) {
    var divId = "divScheduleCalendar_" + this.buildDayLabel(workingDate);
    cell.innerHTML = "<div id=\"" + divId + "\" align=\"center\" style=\"width:20px; height:16px; cursor:hand;\" onmouseover=\"this.style.background='url(http://businesstv.chosun.com/images/200801/day_on.gif) no-repeat'\" onmouseout=\"this.style.background=''\"><a onclick=\"javascript:void(null);\"><font onmouseover=\"this.color='red'\" onmouseout=\"this.color=''\">" + this.buildDayLabel(workingDate) + "</font></a></div>";
  },
  renderCellNotThisMonth: function(workingDate, cell) {
    YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_OOM);
    cell.innerHTML='<div align="center" style="width:20px; height:16px;"><font color="#A0A0A0">' + workingDate.getDate() + '</font></div>';
    return YAHOO.widget.Calendar.STOP_RENDER;
  }
});