var startYearObj;
var startMonthObj;
var startDayObj;

var endYearObj;
var endMonthObj;
var endDayObj;

var calendarWindow;

function init(startYear, startMonth, startDay,endYear, endMonth, endDay) {
  startYearObj  = eval("document.calFrm." + startYear);
  startMonthObj = eval("document.calFrm." + startMonth);
  startDayObj   = eval("document.calFrm." + startDay);
  endYearObj    = eval("document.calFrm." + endYear);
  endMonthObj   = eval("document.calFrm." + endMonth);
  endDayObj     = eval("document.calFrm." + endDay);
}

function updateDateEnd() {

  var startDate = getDateByListBoxes(startYearObj, startMonthObj, startDayObj);
  
  var tmpDate = getNextDate(startDate);
  
  if (getIndexInListBox(endYearObj, tmpDate.getFullYear()) == -1) {

    tmpDate = startDate;
  }
  setItemSelectedInListBox(endYearObj, getYear(tmpDate));
  setItemSelectedInListBox(endMonthObj, getMonth(tmpDate));
  setItemSelectedInListBox(endDayObj, getDay(tmpDate));
}


function updateDateStart() {
  
  var startDate = getDateByListBoxes(startYearObj, startMonthObj, startDayObj);
  
  var endDate = getDateByListBoxes(endYearObj, endMonthObj, endDayObj);

  if (startDate.getTime() > endDate.getTime()) {
    var tmpDate = getPrevDate(endDate);
    
    if (getIndexInListBox(startYearObj, tmpDate.getFullYear()) == -1 || isToday(endDate)) {

      tmpDate = endDate;
    }
    setItemSelectedInListBox(startYearObj, getYear(tmpDate));
    setItemSelectedInListBox(startMonthObj, getMonth(tmpDate));
    setItemSelectedInListBox(startDayObj, getDay(tmpDate));
  }
}

function createCalendar(targetYear, targetMonth, targetDay, callBackFn) {
  calendarWindow = window.open('', 'Calendar',
                               'width=250,height=224,resizable=no,scrollbars=no,left=200,top=160');
  
  var year  = getSelectedItemInListBox(eval("document.calFrm." + targetYear));
  var month = getSelectedItemInListBox(eval("document.calFrm." + targetMonth));

  generateCalendar(calendarWindow, year, month, targetYear, targetMonth, targetDay, callBackFn);
}

////////////////////////////////////////////////////////////////////////////////

function getPrevImgSrc() {
  return "/hoteladmin/modules/reserve/skins/default/images/icon/prev.gif";
}

function getNextImgSrc() {
  return "/hoteladmin/modules/reserve/skins/default/images/icon/next.gif";
}

function getDayOfWeekStr(dayOfWeek) {
  if (dayOfWeek == DOW_SUNDAY) {
    return "<font color=red>Sun</font>";
  } else if (dayOfWeek == DOW_MONDAY) {
    return "Mon";
  } else if (dayOfWeek == DOW_TUESDAY) {
    return "Tue";
  } else if (dayOfWeek == DOW_WEDNESDAY) {
    return "Wed";
  } else if (dayOfWeek == DOW_THURSDAY) {
    return "Thu";
  } else if (dayOfWeek == DOW_FRIDAY) {
    return "Fri";
  } else if (dayOfWeek == DOW_SATURDAY) {
    return "<font color=blue>Sat</font>";
  } else {
    return "";
  }
}

function generateCalendar(targetWindow, year, month, targetYear, targetMonth, targetDay, callBackFn) {
  targetWindow.document.open();
  
  var today = getToday();
  
  var prevMonth = getPrevMonth(month);
  var nextMonth = getNextMonth(month);
  var prevYear = getYearOfPrevMonth(parseInt(year, 10), parseInt(month, 10));
  var nextYear = getYearOfNextMonth(parseInt(year, 10), parseInt(month, 10));
  calendar = ""
	+	"<html>\n"
    +	"<head>\n"
    +	"<title>Calendar</title>\n"
    +	"<style type='text/css'>\n"
    +	"a {color:#6E4519;font-weight: bold;text-decoration:none;}\n"
    +	"a:hover {color:red;font-weight: bold;text-decoration:none;}\n"
    +	"body, table, tr, td{\n"
	+	"font-family:Arial, Verdana, sans-serif;\n"
	+	"font-size:12px;\n"
	+	"color:black;\n"
	+	"line-height:130%; \n"
	+	"}	\n"
    +	"</style>\n"
    +	"</head>\n"
    +	"<body bgcolor='#FFFFFF' marginheight='0' marginwidth='0' topmargin='5' leftmargin='0'>\n"
	+	"<table cellspacing='0' border='0' width='240' align=center>\n"
	+	"<tr>\n"
	+	"<td align=center height=24><img src='/hoteladmin/modules/reserve/skins/default/images/cal_sj.gif' border='0'></td>\n"
	+	"</tr>\n"
	+	"</table>\n"
	+	"<table cellspacing='0' border='0' width='240' align=center>\n"
	+	"<tr>\n"
	+	"<td colspan=2><table width=100% height=25 cellpadding=4 cellspacing=0 style='border:1px #DED2BE solid;background-color:#FAF7F2'>\n"
	+	"<tr>\n"
    +	"<td width='12%' align=center>\n";
  if ((new Date(prevYear, prevMonth, 1)).getTime() > today.getTime()) {
    calendar += "<a href='javascript:"
    + getScriptGenerateCalendar("self", prevYear, prevMonth, targetYear, targetMonth, targetDay, callBackFn)
    +	 "'>"
    +	 "<img src=" + getPrevImgSrc() + " border=0 align=absmiddle alt='Prev'>"
    +	 " </a>\n"
  } else {
    calendar += "";
  }
  calendar += "      </td>\n"
    +         "      <td width='76%' align=center>\n"
    + "<b><font color='#6E4519'>" +year + " / " + month + "</font></b>\n"
    +         "      </td>\n"
    +         "      <td width='12%' align=center>\n";
  if (getIndexInListBox(eval("document.calFrm." + targetYear), nextYear) != -1) {
    calendar += "         <a href='javascript:"
      + getScriptGenerateCalendar("self", nextYear, nextMonth, targetYear, targetMonth, targetDay, callBackFn)
      +         "'>"
      +         "              <img src=" + getNextImgSrc() + " border=0 align=absmiddle alt='Next'>"
      +         "            </a>\n"
  } else {
    calendar += "";
  }
  calendar += " </td></tr></table></td></tr>\n"

    +         "    <tr><td colspan=2><table cellspacing='1' cellpadding='3' border='0' width='100%' style='background-color:#DED2BE'>\n"
    +         "    <tr bgcolor='#FAF7F2'>\n"
    +         "      <td width=30 style='font-size:11px'>\n"
    +         "        <div align='center'><b>" + getDayOfWeekStr(DOW_SUNDAY) + "</b></div>\n"
    +         "      </td>\n"
    +         "      <td width=30 style='font-size:11px'>\n"
    +         "        <div align='center'><b>" + getDayOfWeekStr(DOW_MONDAY) + "</b></div>\n"
    +         "      </td>\n"
    +         "      <td width=30 style='font-size:11px'>\n"
    +         "        <div align='center'><b>" + getDayOfWeekStr(DOW_TUESDAY) + "</b></div>\n"
    +         "      </td>\n"
    +         "      <td width=30 style='font-size:11px'>\n"
    +         "        <div align='center'><b>" + getDayOfWeekStr(DOW_WEDNESDAY) + "</b></div>\n"
    +         "      </td>\n"
    +         "      <td width=30 style='font-size:11px'>\n"
    +         "        <div align='center'><b>" + getDayOfWeekStr(DOW_THURSDAY) + "</b></div>\n"
    +         "      </td>\n"
    +         "      <td width=30 style='font-size:11px'>\n"
    +         "        <div align='center'><b>" + getDayOfWeekStr(DOW_FRIDAY) + "</b></div>\n"
    +         "      </td>\n"
    +         "      <td width=30 style='font-size:11px'>\n"
    +         "        <div align='center'><b>" + getDayOfWeekStr(DOW_SATURDAY) + "</b></div>\n"
    +         "      </td>\n"
    +         "    </tr>\n"
    +         "    <tr align=center bgcolor=#ffffff>\n";
  
  var firstDayOfWeek = (new Date(year + "/" + month + "/01")).getDay();
  for (var i = 0; i < firstDayOfWeek; i++) {
    calendar += "      <td>\n"
      +         "          &nbsp;\n"
      +         "      </td>\n";
  }
  
  var lastDay = getDaysInMonth(month, year);
  var dayOfWeek = firstDayOfWeek;
  for (var i = 0; i < lastDay; i++) {
    calendar += "      <td align='center' bgcolor=#ffffff>\n";
    if ((new Date(year, (month - 1), (i + 1))).getTime() >= today.getTime()) {
      calendar += "          <a href='javascript:"
        + getScriptSetDate(year, month, (i + 1), targetYear, targetMonth, targetDay, callBackFn)
        +         "'>"
        +         "            <div align='center'>" + (i + 1) + "</div>"
        +         "          </a>\n";
    } else {
      calendar += "          <div align='center'>" + (i + 1) + "</div>";
    }
    calendar += "      </td>\n";

    dayOfWeek = (dayOfWeek + 1) % 7;
    if (dayOfWeek == 0) {
      if (i != lastDay - 1) {
        calendar += "    </tr>\n"
          +         "    <tr>\n";
      }
    }
  }
  
  if (dayOfWeek != DOW_SUNDAY) {
    for (var i = dayOfWeek; i < 7; i++) {
      calendar += "      <td bgcolor=#ffffff>\n"
        +         "          &nbsp;\n"
        +         "      </td>\n";
    }
  }
  calendar += "    </tr>\n"
    +         "  </table></td></tr></table>\n"
    +         "</body>\n"
    +         "</html>\n";

  targetWindow.document.write(calendar);
  targetWindow.document.close();
}

function getScriptSetDate(year, month, day, targetYear, targetMonth, targetDay, callBack) {
  return "opener.setDate(" + year + ", " + month + ", " + day + ", "
    +                           "\"" + targetYear + "\", "
    +                           "\"" + targetMonth + "\", "
    +                           "\"" + targetDay + "\", "
    +                           "\"" + callBack + "\");"
    +    "self.close();";
}

function getScriptGenerateCalendar(targetWindow, year, month, targetYear, targetMonth, targetDay, callBack) {
  return "opener.generateCalendar("
    + targetWindow + ", "
    + year + ", "
    + month + ", "
    + "\"" + targetYear + "\", "
    + "\"" + targetMonth + "\", "
    + "\"" + targetDay + "\", "
    + "\"" + callBack + "\")";
}

function setDate(year, month, day, targetYear, targetMonth, targetDay, callBack) {
  var objYear  = eval("document.calFrm." + targetYear);
  var objMonth = eval("document.calFrm." + targetMonth);
  var objDay   = eval("document.calFrm." + targetDay);
  
  // Update the controls.
  var yearIndex = getIndexInListBox(objYear, year);
  objYear.selectedIndex = yearIndex;
  objMonth.selectedIndex = month -1;
  objDay.selectedIndex = parseInt(day - 1, 10);
  
  // Call the callback function.
  eval(callBack);
}

function getDateByListBoxes(listYear, listMonth, listDay) {
  var year  = getSelectedItemInListBox(listYear);
  var month = getSelectedItemInListBox(listMonth);
  var day   = getSelectedItemInListBox(listDay);
  return new Date(year, month - 1, day);
}

//date
var DOW_SUNDAY    = 0; 
var DOW_MONDAY    = 1;
var DOW_TUESDAY   = 2;
var DOW_WEDNESDAY = 3;
var DOW_THURSDAY  = 4;
var DOW_FRIDAY    = 5;
var DOW_SATURDAY  = 6;

function getYear(date) {
  return date.getFullYear();
}

function getMonth(date) {
  return (parseInt(date.getMonth(), 10) + 1);
}

function getDay(date) {
  return date.getDate();
}

function getDayOfWeek(date) {
  return date.getDay();
}

function createDate(year, month, day) {
  return new Date(year, month - 1, day);
}

////////////////////////////////////////////////////////////////////////////////

function isLeapYear(year) {
  return ((parseInt(year, 10) % 4) == 0);
}

function getToday() {
  var tmpToday = new Date();
  return new Date(tmpToday.getFullYear(), tmpToday.getMonth(), tmpToday.getDate());
}

function isToday(targetDate) {
  var today = new Date();
  return ((today.getFullYear() == targetDate.getFullYear())
          && (today.getMonth() == targetDate.getMonth())
          && (today.getDate() == targetDate.getDate()));
}

function getDaysInMonth(month, year) {
  if (month == 2) {
    if (isLeapYear(year)) {
      return 29;
    } else {
      return 28;
    }
  } else if (month == 4 || month == 6 || month == 9 || month == 11) {
    return 30;
  } else {
    return 31;
  }
}

function getNextDate(targetDate) {
  var year  = parseInt(getYear(targetDate), 10);
  var month = parseInt(getMonth(targetDate), 10);
  var day   = parseInt(getDay(targetDate), 10) + 1;
  
  if (day > getDaysInMonth(month, year)) {
    day = 1;
    month = month + 1;

    if (month > 12) {
      month = 1;
      year = year + 1;
    }
  }
  return createDate(year, month, day);
}

function getPrevDate(targetDate) {
  var year  = parseInt(getYear(targetDate), 10);
  var month = parseInt(getMonth(targetDate), 10);
  var day   = parseInt(getDay(targetDate), 10) - 1;
  
  if (day == 0) {
    if (month == 1) {
      year = year - 1;
      month = 12;
    } else {
      month = month - 1;
    }
    day = getDaysInMonth(month, year);
  }
  return createDate(year, month, day);
}

function getNextMonth(month) {
  if (month == 12) {
    return 1;
  } else {
    return parseInt(month, 10) + 1;
  }
}

function getPrevMonth(month) {
  if (month == 1) {
    return 12;
  } else {
    return parseInt(month, 10) - 1;
  }
}

function getYearOfNextMonth(year, month) {
  if (month == 12) {
    return parseInt(year, 10) + 1;
  } else {
    return year;
  }
}

function getYearOfPrevMonth(year, month) {
  if (month == 1) {
    return parseInt(year, 10) - 1;
  } else {
    return year;
  }
}


//form
function getIndexInListBox(obj, val) {
  for (var i = 0; i < obj.length; i++) {
    if (obj.options[i].value == val) {
      return i;
    }
  }
  return -1;
}

function setItemSelectedInListBox(obj, val) {
  for (var i = 0; i < obj.length; i++) {
    if (obj.options[i].value == val) {
      obj.options[i].selected = true;
    } else {
      obj.options[i].selected = false;
    }
  }
}

function getSelectedItemInListBox(obj) {
  var index = obj.selectedIndex;
//  return parseInt(obj.options[index].value, 10);
  return obj.options[index].value;
}