var CalCtrl = {
  alwaysShowCalendar: false,
  resizeParentFrame: true,
  clickSrc: null,
  onDateSelected: function() {}
};

CalCtrl.setEventDates = function(arr) {
  if (arr == null) arr = [];
  this.eventDates = arr;
}

CalCtrl.setToday = function(e) {
  this.setYearMonth(this.todayYear, this.todayMonth);
  this.setDate(this.todayYear, this.todayMonth, this.todayDay);
};

CalCtrl.setDate = function(y, m, d) {
  if (m < 10) m = "0" + m;
  if (d < 10) d = "0" + d;

  var dv = y + "/" + m + "/" + d;

  this.gdCtrl.value = dv;
  this.rdCtrl.value = dv;

  if (this.gdCtrl.onchange != null) this.gdCtrl.onchange();
  if (this.onDateSelected != null) this.onDateSelected(dv);

  if (!this.alwaysShowCalendar)
  this.closeCal();
}


CalCtrl.setSelected = function(e) {
  var offset = 0;
  var y = window.parseInt(CalCtrl.tbSelYear.value, 10);
  var m = window.parseInt(CalCtrl.tbSelMonth.value, 10);
  var event = e || window.event;
  var cell = event.target || event.srcElement;
  var d = window.parseInt(cell.firstChild.nodeValue, 10);

  cell.style.backgroundColor = CalCtrl.COLOR_HILIT;

  if (CalCtrl.preObj != null) {
    CalCtrl.preObj.style.backgroundColor = CalCtrl.COLOR_BG;
  }

  CalCtrl.preObj = cell;

  if (cell.getAttribute("inmonth") == "f") {
    offset = (cell.getAttribute("victor") < 10) ? -1 : 1;
  }

  m += offset;
  if (m < 1) {
    y--;
    m = 12;
  } else if (m > 12) {
    y++;
    m = 1;
  }

  CalCtrl.setDate(y, m, d);
}

CalCtrl.build = function(y, m) {
  var mm = new Array();
  for (var i = 1; i < 7; i++)
    mm[i] = new Array(i);

  var dCalDate = new Date(y, m - 1, 1);
  var iDayOfFirst = dCalDate.getDay();
  var iDaysInMonth = new Date(y, m, 0).getDate();
  var iOffsetLast = new Date(y, m - 1, 0).getDate() - iDayOfFirst + 1;
  var iDate = 1;
  var next = 1;

  for (d = 0; d < 7; d++)
    mm[1][d] = (d < iDayOfFirst)?-(iOffsetLast + d):iDate++;
  for (w = 2; w < 7; w++)
    for (d = 0; d < 7; d++)
      mm[w][d] = (iDate <= iDaysInMonth) ? iDate++:-(next++);

  return mm;
}

CalCtrl.getDateColor = function(y, m, s) {
  var ay = y, am = m, ad = s;
  if (s < 0) {
    var offset = (s < -15) ? -1 : +1;
    am += offset;
    if (am < 1) {
      ay--;
      am = 12;
    } else if (am > 12) {
      ay++;
      am = 1;
    }
    ad = -s;
  }

  var key = ay + '/' + am + '/' + ad;
  return (this.eventDates[key] != null) ? this.COLOR_EVENT : this.COLOR_GRAY;
};

CalCtrl.draw = function(iYear, iMonth) {
  var weekday = new Array("<font color=red>Sun.</font>", "<font color=WHITE>Mon.</font>", "<font color=WHITE>Tue.</font>",
          "<font color=WHITE>Wed.</font>", "<font color=WHITE>Thu.</font>", "<font color=WHITE>Fri.</font>",
          "<font color=WHITE>Sat.<font>");

  with (document) {
    write("<tr>");
    write("<td class='content-table-border'><table width='100%' border='0' align='center' cellpadding='1' cellspacing='1'>");
    write("<tr class='content-table-text-title' style='font-family:tahoma;font-size:11px;text-align:center'>");

    for (var i = 0; i < 7; i++) {
      write("<td class='view_text' height='21' width='30'>" + weekday[i] + "</td>");
    }

    write("</tr>");

    for (var w = 0; w < 6; w++) {
      write("<tr>");

      for (var d = 0; d < 7; d++) {
        write("<td id=\"cellText" + (7 * w + d) + "\" victor=\"lw\" " + " bgcolor='" + this.COLOR_BG + "' valign='middle' " +
              "align='center' height='18' style='font:bold 12px tahoma;" + "cursor:pointer;' " +
              "onmouseover='CalCtrl.cellHover(this, true)' onmouseout='CalCtrl.cellHover(this, false)'>1</td>");
      }

      write("</tr>");
    }
    write("</table></td>");
    write("</tr>");
  }
}

CalCtrl.update = function(y, m) {
  var mm = CalCtrl.build(y, m);
  var i = 0;
  var f = function(event) {
    CalCtrl.setSelected(event);
  };
  for (var w = 0; w < 6; w++) {
    for (var d = 0; d < 7; d++) {
      var cell = window.document.getElementById("cellText" + (7 * w + d));
      cell.setAttribute("victor", i++);
      if (mm[w + 1][d] < 0) {
        cell.style.color = CalCtrl.COLOR_GRAY;
        cell.firstChild.nodeValue = -mm[w + 1][d];
        cell.setAttribute("inmonth", "f");
      } else {
        cell.style.color = ((d == 0) || (d == 6)) ? "red" : "black";
        cell.firstChild.nodeValue = mm[w + 1][d];
        cell.setAttribute("inmonth", "t");
      }
      cell.onclick = f;
      cell.style.color = this.getDateColor(y, m, mm[w + 1][d]);
    }
  }
}

CalCtrl.cellHover = function(cell, b) {
  cell.style.backgroundColor = b ? this.COLOR_HILIT : this.COLOR_BG;
}

CalCtrl.setYearMonth = function(iYear, iMon) {
  CalCtrl.tbSelMonth.options[iMon - 1].selected = true;
  for (i = 0; i < CalCtrl.tbSelYear.length; i++)
    if (CalCtrl.tbSelYear.options[i].value == iYear)
      CalCtrl.tbSelYear.options[i].selected = true;
  this.update(iYear, iMon);
}

CalCtrl.fPrevMonth = function() {
  var iMon = CalCtrl.tbSelMonth.value;
  var iYear = CalCtrl.tbSelYear.value;

  if (--iMon < 1) {
    iMon = 12;
    iYear--;
  }

  this.setYearMonth(iYear, iMon);
}

CalCtrl.fNextMonth = function() {
  var iMon = CalCtrl.tbSelMonth.value;
  var iYear = CalCtrl.tbSelYear.value;

  if (++iMon > 12) {
    iMon = 1;
    iYear++;
  }

  this.setYearMonth(iYear, iMon);
}


/*
    IE only
*/

function getClickSrcElement(e) {
    var IE = document.all? true:false;
    if (IE) {
        var event = e || window.event;
        if ((event.clientX > 0) && (event.clientY > 0) && (event.clientX < document.body.clientWidth) && (event.clientY < document.body.clientHeight)) {
            return document.elementFromPoint(event.clientX, event.clientY);
        }
    }
    return null;
}


CalCtrl.setClickSrc = function(e) {
    clickSrc = getClickSrcElement(e);
}

CalCtrl.hide = function(e) {
    var IE = document.all? true:false
    var event = e || window.event;

    if (this.alwaysShowCalendar)
        return;

    if (IE) {
        if ((event.clientX > 0) && (event.clientY > 0) && (event.clientX < document.body.clientWidth) && (event.clientY < document.body.clientHeight)) {
            var tmp = document.elementFromPoint(event.clientX, event.clientY);
            if (tmp == clickSrc) {
                return;
            }

            while (tmp && (tmp.tagName.toUpperCase() != "BODY") && (tmp.id != "viccalendar")) {
              tmp = tmp.offsetParent;
            }
            if (tmp && tmp.id == "viccalendar") return;
        }
    }else{
        return;
    }

    this.closeCal();
}


CalCtrl.closeCal = function() {
    this.viccalendar.style.display = "none";
    this.rollback();
}


CalCtrl.getXY = function(tag) {
  var k = tag;
  var pt = {x:0, y:0};
  do {
    pt.x += k.offsetLeft;
    pt.y += k.offsetTop;
    k = k.offsetParent;
  } while (k && k.tagName != "body");
  return pt;
}

CalCtrl.start = function() {
  var gdCurDate = new Date();
  this.giYear = this.todayYear = gdCurDate.getFullYear();
  this.giMonth = this.todayMonth = gdCurDate.getMonth() + 1;
  this.giDay = this.todayDay = gdCurDate.getDate();
  this.gdCtrl = new Object();
  this.rdCtrl = new Object();
  this.preObj = null;
  this.COLOR_HILIT = "#ffffdd";
  this.COLOR_GRAY = "#000000";
  this.COLOR_BG = "#FFFFFF";
  this.COLOR_EVENT = "#CC9912";
  this.eventDates = [];

  var months = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
  with (document) {
    write("<div id='viccalendar' onblur='javascript:CalCtrl.hide(event);' style='position:absolute;display:none;border:2px solid #DDDDDD;width:239;z-index:100;background-color:#FFFFFF'>");
    write("<table border='0' bgcolor='white' width='240' height='170' cellspacing='0' cellpadding='0'>");
    write("<tr>");
    write("<td valign='middle' align='center'>" +
          "<input id='PrevMonth' onblur='CalCtrl.hide(event)' type='button' class='content-button-text' value='<' style='height:20;width:20;font-weight:bold' onclick='CalCtrl.fPrevMonth()''>");
    write("&nbsp;" +
          "<select id='tbSelYear' onblur='CalCtrl.hide(event)' onchange='CalCtrl.update(CalCtrl.tbSelYear.value, CalCtrl.tbSelMonth.value)' victor='Won' style='font-size:11px;font-family:tahoma'>");
    for (i = 1800; i <= 2024; i++) {
      write("<option value='" + i + "'>" + (i) + "</option>");
    }
    write("</select>");
    write("&nbsp;" +
          "<select id='tbSelMonth' onblur='CalCtrl.hide(event)' onchange='CalCtrl.update(CalCtrl.tbSelYear.value, CalCtrl.tbSelMonth.value)' victor='Won' style='font-size:11px;font-family:tahoma'>");

    for (i = 0; i < 12; i++) {
      write("<option value='" + (i + 1) + "'>" + months[i] + "</option>");
    }

    write("</select>");
    write("&nbsp;" +
          "<input id='PrevMonth' onblur='CalCtrl.hide(event)' type='button' class='content-button-text' value='>' style='height:20;width:20;font-weight:bold' onclick='CalCtrl.fNextMonth()'>");
    write("</td>");
    write("</tr><tr>");
    write("<td align='center'>");
    write("<table width='100%' border='0' cellspacing='0' cellpadding='0'>");

    this.draw(this.giYear, this.giMonth);

    write("</table>");
    write("</td>");
    write("</tr><tr><td align='center' style='font-family:tahoma;font-size:11px;background-color:#EEEEEE'>");
    write("<b style='cursor:pointer' onclick='CalCtrl.setToday(event)' onmouseover='this.style.backgroundColor=CalCtrl.COLOR_HILIT' onmouseout='this.style.backgroundColor=\"#EEEEEE\"'>Today " +
          this.giYear + "/" + this.giMonth + "/" + this.giDay + "</b>");
    write("</td></tr>");
    write("</table>");
    write("<iframe  style='position:absolute;z-index:-1;width:241;height:171;top:0;left:0;scrolling:no;' frameborder='0' src='about:blank'></iframe>")
    write("</div>");
  }

  // Has to do here since these elements are generated by javascript.
  this.tbSelYear = window.document.getElementById("tbSelYear");
  this.tbSelMonth = window.document.getElementById("tbSelMonth");
  this.viccalendar = window.document.getElementById("viccalendar");
  this.relocated = false;
};

CalCtrl.rollback = function() {
  x = document.getElementById("framerow");
  if (x == null)
    CalCtrl.changeRows("90,*");
  else
    CalCtrl.changeRows(x.value+",*");
}

CalCtrl.changeRows = function(a) {
  if (this.resizeParentFrame) {
    if (window.parent) {
      var w = window.parent.document.getElementById("rightframeset");
      if (w) {
        if (typeof(window.parent.frames["helperFrame"]) != "undefined")
          w.setAttribute("rows", "25,"+a);
        else
          w.setAttribute("rows", a);
      }
    }
  }
}

CalCtrl.isValid = function(year, month, day) {
  var mDays = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
  var mDaysPlus = new Array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
  var mdays = mDays;

  if ((year < 1900) || (year > 2100)) return(false);
  if (month.length == 1) month = "0" + month;
  if (day.length == 1) day = "0" + day;
  if ((month < "01") || (month > "12")) return(false);
  if ((day < "01") || (month > "31")) return(false);
  if ((year % 400) == 0 || (year % 100) != 0 && (year % 4) == 0) mdays = mDaysPlus;
  if (day <= 0 || day > mdays[month - 1]) {
    //errmsg("Date Error!! There is no that day in the month you choose !");
    return(false);
  }
  return(true);
}


CalCtrl.isDate = function(date) {
  var d = date;
  if (d.length <= 0) return(false);
  if (d.match(new RegExp("[^-/.\\d:\\s]+"))) return(false);
  if (d.match(new RegExp("\\d{4}[-/.].*\\d{3}"))) return(false);
  if (d.match(new RegExp("\\d{5}"))) return(false);
  if (d.match(new RegExp("\\d{4}[-/.]\\d\\d?[-/.]\\d\\d?\\s+\\d"))) return(false);
  if (d.match(new RegExp("\\d{4}[-/.]\\d\\d?[-/.]\\d\\d?"))) { // isValid
    var separator = "";
    if (d.indexOf("/") >= 0) {
      separator = "/";
    } else if (d.indexOf(".") >= 0) {
      separator = ".";
    } else {
      separator = "-";
    }
    var as = d.split(separator);
    if (!as) return false;
    if (as.length != 3) return(false);
    if (!this.isValid(as[0], as[1], as[2])) return false;
    return true;
  }
  return false;
}

/**
 * @return an integer
 */
CalCtrl.getYear = function(s) {
  return parseInt(s.substring(0, s.indexOf("/")), 10);
}

/**
 * @return an integer
 */
CalCtrl.getMonth = function(s) {
  return parseInt(s.substring(s.indexOf("/") + 1, s.lastIndexOf("/")), 10);
}

CalCtrl.relocate = function() {
  this.viccalendar.parentNode.removeChild(this.viccalendar);
  window.document.documentElement.getElementsByTagName("body")[0].appendChild(this.viccalendar);
  this.relocated = true;
};

CalCtrl.invoke = function(popCtrl, dateCtrl, relatedCtrl, idx) {
  if (!this.relocated) {
    this.relocate();
  }
  this.changeRows("280,*");

  this.gdCtrl = dateCtrl;
  this.rdCtrl = relatedCtrl;

  if (this.isDate(dateCtrl.value)) {
    this.giYear = this.getYear(dateCtrl.value);
    this.giMonth = this.getMonth(dateCtrl.value);
  }

  this.setYearMonth(this.giYear, this.giMonth);
  var point = this.getXY(popCtrl);

  with (this.viccalendar.style) {
    left = point.x;
    top = point.y + popCtrl.offsetHeight + 1;
  }

  with (this.viccalendar.style) {
    display = 'block';
  }

 this.viccalendar.focus();

};

CalCtrl.popCalendar = function(ctrl) {
  CalCtrl.invoke(ctrl, ctrl, ctrl, 1);
};

// Main: popCtrl is the widget beyond which you want this calendar to appear;
//       dateCtrl is the widget into which you want to put the selected date.
function fPopCalendar(popCtrl, dateCtrl, relatedCtrl, idx) {
    CalCtrl.setClickSrc();
    if (CalCtrl.viccalendar.style.display == 'block'){
      CalCtrl.closeCal();
    }else{
      CalCtrl.invoke(popCtrl, dateCtrl, relatedCtrl, idx);
    }
}

CalCtrl.start();
