All browser Calendar : Calendar « GUI Components « JavaScript DHTML

JavaScript DHTML
1. Ajax Layer
2. Data Type
3. Date Time
4. Development
5. Document
6. Event
7. Event onMethod
8. Form Control
9. GUI Components
10. HTML
11. Javascript Collections
12. Javascript Objects
13. Language Basics
14. Node Operation
15. Object Oriented
16. Page Components
17. Security
18. Style Layout
19. Table
20. Utilities
21. Window Browser
Microsoft Office Word 2007 Tutorial
Java
Java Tutorial
Java Source Code / Java Documentation
Java Open Source
Jar File Download
Java Articles
Java Products
Java by API
C# / C Sharp
C# / CSharp Tutorial
ASP.Net
JavaScript Tutorial
JavaScript Reference
HTML / CSS
HTML CSS Reference
C / ANSI-C
C Tutorial
C++
C++ Tutorial
PHP
Python
SQL Server / T-SQL
Oracle PL / SQL
Oracle PL/SQL Tutorial
PostgreSQL
SQL / MySQL
MySQL Tutorial
VB.Net
VB.Net Tutorial
JavaScript DHTML » GUI Components » Calendar 
All browser Calendar

<html>

<head>
<meta http-equiv="content-type" content="text/xml; charset=utf-8" />

<title>Simple calendar setups [popup calendar]</title>

  <!-- calendar stylesheet -->
  <style rel="stylesheet" type="text/css" media="all" title="win2k-cold-1">
/* The main calendar widget.  DIV containing a table. */

.calendar {
  position: relative;
  display: none;
  border-top: 2px solid #fff;
  border-right: 2px solid #000;
  border-bottom: 2px solid #000;
  border-left: 2px solid #fff;
  font-size: 11px;
  color: #000;
  cursor: default;
  background: #c8d0d4;
  font-family: tahoma,verdana,sans-serif;
}

.calendar table {
  border-top: 1px solid #000;
  border-right: 1px solid #fff;
  border-bottom: 1px solid #fff;
  border-left: 1px solid #000;
  font-size: 11px;
  color: #000;
  cursor: default;
  background: #c8d0d4;
  font-family: tahoma,verdana,sans-serif;
}

/* Header part -- contains navigation buttons and day names. */

.calendar .button /* "<<", "<", ">", ">>" buttons have this class */
  text-align: center;
  padding: 1px;
  border-top: 1px solid #fff;
  border-right: 1px solid #000;
  border-bottom: 1px solid #000;
  border-left: 1px solid #fff;
}

.calendar .nav {
  background: transparent url(menuarrow.gifno-repeat 100100%;
}

.calendar thead .title /* This holds the current "month, year" */
  font-weight: bold;
  padding: 1px;
  border: 1px solid #000;
  background: #788084;
  color: #fff;
  text-align: center;
}

.calendar thead .headrow /* Row <TR> containing navigation buttons */
}

.calendar thead .daynames /* Row <TR> containing the day names */
}

.calendar thead .name /* Cells <TD> containing the day names */
  border-bottom: 1px solid #000;
  padding: 2px;
  text-align: center;
  background: #e8f0f4;
}

.calendar thead .weekend /* How a weekend day name shows in header */
  color: #f00;
}

.calendar thead .hilite /* How do the buttons in header appear when hover */
  border-top: 2px solid #fff;
  border-right: 2px solid #000;
  border-bottom: 2px solid #000;
  border-left: 2px solid #fff;
  padding: 0px;
  background-color: #d8e0e4;
}

.calendar thead .active /* Active (pressed) buttons in header */
  padding: 2px 0px 0px 2px;
  border-top: 1px solid #000;
  border-right: 1px solid #fff;
  border-bottom: 1px solid #fff;
  border-left: 1px solid #000;
  background-color: #b8c0c4;
}

/* The body part -- contains all the days in month. */

.calendar tbody .day /* Cells <TD> containing month days dates */
  width: 2em;
  text-align: right;
  padding: 2px 4px 2px 2px;
}
.calendar tbody .day.othermonth {
  font-size: 80%;
  color: #aaa;
}
.calendar tbody .day.othermonth.oweekend {
  color: #faa;
}

.calendar table .wn {
  padding: 2px 3px 2px 2px;
  border-right: 1px solid #000;
  background: #e8f4f0;
}

.calendar tbody .rowhilite td {
  background: #d8e4e0;
}

.calendar tbody .rowhilite td.wn {
  background: #c8d4d0;
}

.calendar tbody td.hilite /* Hovered cells <TD> */
  padding: 1px 3px 1px 1px;
  border: 1px solid;
  border-color: #fff #000 #000 #fff;
}

.calendar tbody td.active /* Active (pressed) cells <TD> */
  padding: 2px 2px 0px 2px;
  border: 1px solid;
  border-color: #000 #fff #fff #000;
}

.calendar tbody td.selected /* Cell showing selected date */
  font-weight: bold;
  padding: 2px 2px 0px 2px;
  border: 1px solid;
  border-color: #000 #fff #fff #000;
  background: #d8e0e4;
}

.calendar tbody td.weekend /* Cells showing weekend days */
  color: #f00;
}

.calendar tbody td.today /* Cell showing today date */
  font-weight: bold;
  color: #00f;
}

.calendar tbody .disabled color: #999}

.calendar tbody .emptycell /* Empty cells (the best is to hide them) */
  visibility: hidden;
}

.calendar tbody .emptyrow /* Empty row (some months need less than 6 rows) */
  display: none;
}

/* The footer part -- status bar and "Close" button */

.calendar tfoot .footrow /* The <TR> in footer (only one right now) */
}

.calendar tfoot .ttip /* Tooltip (status bar) cell <TD> */
  background: #e8f0f4;
  padding: 1px;
  border: 1px solid #000;
  background: #788084;
  color: #fff;
  text-align: center;
}

.calendar tfoot .hilite /* Hover style for buttons in footer */
  border-top: 1px solid #fff;
  border-right: 1px solid #000;
  border-bottom: 1px solid #000;
  border-left: 1px solid #fff;
  padding: 1px;
  background: #d8e0e4;
}

.calendar tfoot .active /* Active (pressed) style for buttons in footer */
  padding: 2px 0px 0px 2px;
  border-top: 1px solid #000;
  border-right: 1px solid #fff;
  border-bottom: 1px solid #fff;
  border-left: 1px solid #000;
}

/* Combo boxes (menus that display months/years for direct selection) */

.calendar .combo {
  position: absolute;
  display: none;
  width: 4em;
  top: 0px;
  left: 0px;
  cursor: default;
  border-top: 1px solid #fff;
  border-right: 1px solid #000;
  border-bottom: 1px solid #000;
  border-left: 1px solid #fff;
  background: #d8e0e4;
  font-size: 90%;
  padding: 1px;
  z-index: 100;
}

.calendar .combo .label,
.calendar .combo .label-IEfix {
  text-align: center;
  padding: 1px;
}

.calendar .combo .label-IEfix {
  width: 4em;
}

.calendar .combo .active {
  background: #c8d0d4;
  padding: 0px;
  border-top: 1px solid #000;
  border-right: 1px solid #fff;
  border-bottom: 1px solid #fff;
  border-left: 1px solid #000;
}

.calendar .combo .hilite {
  background: #048;
  color: #aef;
}

.calendar td.time {
  border-top: 1px solid #000;
  padding: 1px 0px;
  text-align: center;
  background-color: #e8f0f4;
}

.calendar td.time .hour,
.calendar td.time .minute,
.calendar td.time .ampm {
  padding: 0px 3px 0px 4px;
  border: 1px solid #889;
  font-weight: bold;
  background-color: #fff;
}

.calendar td.time .ampm {
  text-align: center;
}

.calendar td.time .colon {
  padding: 0px 2px 0px 3px;
  font-weight: bold;
}

.calendar td.time span.hilite {
  border-color: #000;
  background-color: #667;
  color: #fff;
}

.calendar td.time span.active {
  border-color: #f00;
  background-color: #000;
  color: #0f0;
}
  
  </style>

  <!-- main calendar program -->
  <script type="text/javascript">
/*  Copyright Mihai Bazon, 2002-2005  |  www.bazon.net/mishoo
 * -----------------------------------------------------------
 *
 * The DHTML Calendar, version 1.0 "It is happening again"
 *
 * Details and latest version at:
 * www.dynarch.com/projects/calendar
 *
 * This script is developed by Dynarch.com.  Visit us at www.dynarch.com.
 *
 * This script is distributed under the GNU Lesser General Public License.
 * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
 */

// $Id: calendar.js,v 1.51 2005/03/07 16:44:31 mishoo Exp $

/** The Calendar object constructor. */
Calendar = function (firstDayOfWeek, dateStr, onSelected, onClose) {
  // member variables
  this.activeDiv = null;
  this.currentDateEl = null;
  this.getDateStatus = null;
  this.getDateToolTip = null;
  this.getDateText = null;
  this.timeout = null;
  this.onSelected = onSelected || null;
  this.onClose = onClose || null;
  this.dragging = false;
  this.hidden = false;
  this.minYear = 1970;
  this.maxYear = 2050;
  this.dateFormat = Calendar._TT["DEF_DATE_FORMAT"];
  this.ttDateFormat = Calendar._TT["TT_DATE_FORMAT"];
  this.isPopup = true;
  this.weekNumbers = true;
  this.firstDayOfWeek = typeof firstDayOfWeek == "number" ? firstDayOfWeek : Calendar._FD; // 0 for Sunday, 1 for Monday, etc.
  this.showsOtherMonths = false;
  this.dateStr = dateStr;
  this.ar_days = null;
  this.showsTime = false;
  this.time24 = true;
  this.yearStep = 2;
  this.hiliteToday = true;
  this.multiple = null;
  // HTML elements
  this.table = null;
  this.element = null;
  this.tbody = null;
  this.firstdayname = null;
  // Combo boxes
  this.monthsCombo = null;
  this.yearsCombo = null;
  this.hilitedMonth = null;
  this.activeMonth = null;
  this.hilitedYear = null;
  this.activeYear = null;
  // Information
  this.dateClicked = false;

  // one-time initializations
  if (typeof Calendar._SDN == "undefined") {
    // table of short day names
    if (typeof Calendar._SDN_len == "undefined")
      Calendar._SDN_len = 3;
    var ar = new Array();
    for (var i = 8; i > 0;) {
      ar[--i= Calendar._DN[i].substr(0, Calendar._SDN_len);
    }
    Calendar._SDN = ar;
    // table of short month names
    if (typeof Calendar._SMN_len == "undefined")
      Calendar._SMN_len = 3;
    ar = new Array();
    for (var i = 12; i > 0;) {
      ar[--i= Calendar._MN[i].substr(0, Calendar._SMN_len);
    }
    Calendar._SMN = ar;
  }
};

// ** constants

/// "static", needed for event handlers.
Calendar._C = null;

/// detect a special case of "web browser"
Calendar.is_ie = /msie/i.test(navigator.userAgent&&
       !/opera/i.test(navigator.userAgent) );

Calendar.is_ie5 = Calendar.is_ie && /msie 5\.0/i.test(navigator.userAgent) );

/// detect Opera browser
Calendar.is_opera = /opera/i.test(navigator.userAgent);

/// detect KHTML-based browsers
Calendar.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);

// BEGIN: UTILITY FUNCTIONS; beware that these might be moved into a separate
//        library, at some point.

Calendar.getAbsolutePos = function(el) {
  var SL = 0, ST = 0;
  var is_div = /^div$/i.test(el.tagName);
  if (is_div && el.scrollLeft)
    SL = el.scrollLeft;
  if (is_div && el.scrollTop)
    ST = el.scrollTop;
  var r = x: el.offsetLeft - SL, y: el.offsetTop - ST };
  if (el.offsetParent) {
    var tmp = this.getAbsolutePos(el.offsetParent);
    r.x += tmp.x;
    r.y += tmp.y;
  }
  return r;
};

Calendar.isRelated = function (el, evt) {
  var related = evt.relatedTarget;
  if (!related) {
    var type = evt.type;
    if (type == "mouseover") {
      related = evt.fromElement;
    else if (type == "mouseout") {
      related = evt.toElement;
    }
  }
  while (related) {
    if (related == el) {
      return true;
    }
    related = related.parentNode;
  }
  return false;
};

Calendar.removeClass = function(el, className) {
  if (!(el && el.className)) {
    return;
  }
  var cls = el.className.split(" ");
  var ar = new Array();
  for (var i = cls.length; i > 0;) {
    if (cls[--i!= className) {
      ar[ar.length= cls[i];
    }
  }
  el.className = ar.join(" ");
};

Calendar.addClass = function(el, className) {
  Calendar.removeClass(el, className);
  el.className += " " + className;
};

// FIXME: the following 2 functions totally suck, are useless and should be replaced immediately.
Calendar.getElement = function(ev) {
  var f = Calendar.is_ie ? window.event.srcElement : ev.currentTarget;
  while (f.nodeType != || /^div$/i.test(f.tagName))
    f = f.parentNode;
  return f;
};

Calendar.getTargetElement = function(ev) {
  var f = Calendar.is_ie ? window.event.srcElement : ev.target;
  while (f.nodeType != 1)
    f = f.parentNode;
  return f;
};

Calendar.stopEvent = function(ev) {
  ev || (ev = window.event);
  if (Calendar.is_ie) {
    ev.cancelBubble = true;
    ev.returnValue = false;
  else {
    ev.preventDefault();
    ev.stopPropagation();
  }
  return false;
};

Calendar.addEvent = function(el, evname, func) {
  if (el.attachEvent) { // IE
    el.attachEvent("on" + evname, func);
  else if (el.addEventListener) { // Gecko / W3C
    el.addEventListener(evname, func, true);
  else {
    el["on" + evname= func;
  }
};

Calendar.removeEvent = function(el, evname, func) {
  if (el.detachEvent) { // IE
    el.detachEvent("on" + evname, func);
  else if (el.removeEventListener) { // Gecko / W3C
    el.removeEventListener(evname, func, true);
  else {
    el["on" + evnamenull;
  }
};

Calendar.createElement = function(type, parent) {
  var el = null;
  if (document.createElementNS) {
    // use the XHTML namespace; IE won't normally get here unless
    // _they_ "fix" the DOM2 implementation.
    el = document.createElementNS("http://www.w3.org/1999/xhtml", type);
  else {
    el = document.createElement(type);
  }
  if (typeof parent != "undefined") {
    parent.appendChild(el);
  }
  return el;
};

// END: UTILITY FUNCTIONS

// BEGIN: CALENDAR STATIC FUNCTIONS

/** Internal -- adds a set of events to make some element behave like a button. */
Calendar._add_evs = function(el) {
  with (Calendar) {
    addEvent(el, "mouseover", dayMouseOver);
    addEvent(el, "mousedown", dayMouseDown);
    addEvent(el, "mouseout", dayMouseOut);
    if (is_ie) {
      addEvent(el, "dblclick", dayMouseDblClick);
      el.setAttribute("unselectable"true);
    }
  }
};

Calendar.findMonth = function(el) {
  if (typeof el.month != "undefined") {
    return el;
  else if (typeof el.parentNode.month != "undefined") {
    return el.parentNode;
  }
  return null;
};

Calendar.findYear = function(el) {
  if (typeof el.year != "undefined") {
    return el;
  else if (typeof el.parentNode.year != "undefined") {
    return el.parentNode;
  }
  return null;
};

Calendar.showMonthsCombo = function () {
  var cal = Calendar._C;
  if (!cal) {
    return false;
  }
  var cal = cal;
  var cd = cal.activeDiv;
  var mc = cal.monthsCombo;
  if (cal.hilitedMonth) {
    Calendar.removeClass(cal.hilitedMonth, "hilite");
  }
  if (cal.activeMonth) {
    Calendar.removeClass(cal.activeMonth, "active");
  }
  var mon = cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()];
  Calendar.addClass(mon, "active");
  cal.activeMonth = mon;
  var s = mc.style;
  s.display = "block";
  if (cd.navtype < 0)
    s.left = cd.offsetLeft + "px";
  else {
    var mcw = mc.offsetWidth;
    if (typeof mcw == "undefined")
      // Konqueror brain-dead techniques
      mcw = 50;
    s.left = (cd.offsetLeft + cd.offsetWidth - mcw"px";
  }
  s.top = (cd.offsetTop + cd.offsetHeight"px";
};

Calendar.showYearsCombo = function (fwd) {
  var cal = Calendar._C;
  if (!cal) {
    return false;
  }
  var cal = cal;
  var cd = cal.activeDiv;
  var yc = cal.yearsCombo;
  if (cal.hilitedYear) {
    Calendar.removeClass(cal.hilitedYear, "hilite");
  }
  if (cal.activeYear) {
    Calendar.removeClass(cal.activeYear, "active");
  }
  cal.activeYear = null;
  var Y = cal.date.getFullYear() (fwd ? : -1);
  var yr = yc.firstChild;
  var show = false;
  for (var i = 12; i > 0; --i) {
    if (Y >= cal.minYear && Y <= cal.maxYear) {
      yr.innerHTML = Y;
      yr.year = Y;
      yr.style.display = "block";
      show = true;
    else {
      yr.style.display = "none";
    }
    yr = yr.nextSibling;
    Y += fwd ? cal.yearStep : -cal.yearStep;
  }
  if (show) {
    var s = yc.style;
    s.display = "block";
    if (cd.navtype < 0)
      s.left = cd.offsetLeft + "px";
    else {
      var ycw = yc.offsetWidth;
      if (typeof ycw == "undefined")
        // Konqueror brain-dead techniques
        ycw = 50;
      s.left = (cd.offsetLeft + cd.offsetWidth - ycw"px";
    }
    s.top = (cd.offsetTop + cd.offsetHeight"px";
  }
};

// event handlers

Calendar.tableMouseUp = function(ev) {
  var cal = Calendar._C;
  if (!cal) {
    return false;
  }
  if (cal.timeout) {
    clearTimeout(cal.timeout);
  }
  var el = cal.activeDiv;
  if (!el) {
    return false;
  }
  var target = Calendar.getTargetElement(ev);
  ev || (ev = window.event);
  Calendar.removeClass(el, "active");
  if (target == el || target.parentNode == el) {
    Calendar.cellClick(el, ev);
  }
  var mon = Calendar.findMonth(target);
  var date = null;
  if (mon) {
    date = new Date(cal.date);
    if (mon.month != date.getMonth()) {
      date.setMonth(mon.month);
      cal.setDate(date);
      cal.dateClicked = false;
      cal.callHandler();
    }
  else {
    var year = Calendar.findYear(target);
    if (year) {
      date = new Date(cal.date);
      if (year.year != date.getFullYear()) {
        date.setFullYear(year.year);
        cal.setDate(date);
        cal.dateClicked = false;
        cal.callHandler();
      }
    }
  }
  with (Calendar) {
    removeEvent(document, "mouseup", tableMouseUp);
    removeEvent(document, "mouseover", tableMouseOver);
    removeEvent(document, "mousemove", tableMouseOver);
    cal._hideCombos();
    _C = null;
    return stopEvent(ev);
  }
};

Calendar.tableMouseOver = function (ev) {
  var cal = Calendar._C;
  if (!cal) {
    return;
  }
  var el = cal.activeDiv;
  var target = Calendar.getTargetElement(ev);
  if (target == el || target.parentNode == el) {
    Calendar.addClass(el, "hilite active");
    Calendar.addClass(el.parentNode, "rowhilite");
  else {
    if (typeof el.navtype == "undefined" || (el.navtype != 50 && (el.navtype == || Math.abs(el.navtype2)))
      Calendar.removeClass(el, "active");
    Calendar.removeClass(el, "hilite");
    Calendar.removeClass(el.parentNode, "rowhilite");
  }
  ev || (ev = window.event);
  if (el.navtype == 50 && target != el) {
    var pos = Calendar.getAbsolutePos(el);
    var w = el.offsetWidth;
    var x = ev.clientX;
    var dx;
    var decrease = true;
    if (x > pos.x + w) {
      dx = x - pos.x - w;
      decrease = false;
    else
      dx = pos.x - x;

    if (dx < 0dx = 0;
    var range = el._range;
    var current = el._current;
    var count = Math.floor(dx / 10% range.length;
    for (var i = range.length; --i >= 0;)
      if (range[i== current)
        break;
    while (count-- > 0)
      if (decrease) {
        if (--i < 0)
          i = range.length - 1;
      else if ++i >= range.length )
        i = 0;
    var newval = range[i];
    el.innerHTML = newval;

    cal.onUpdateTime();
  }
  var mon = Calendar.findMonth(target);
  if (mon) {
    if (mon.month != cal.date.getMonth()) {
      if (cal.hilitedMonth) {
        Calendar.removeClass(cal.hilitedMonth, "hilite");
      }
      Calendar.addClass(mon, "hilite");
      cal.hilitedMonth = mon;
    else if (cal.hilitedMonth) {
      Calendar.removeClass(cal.hilitedMonth, "hilite");
    }
  else {
    if (cal.hilitedMonth) {
      Calendar.removeClass(cal.hilitedMonth, "hilite");
    }
    var year = Calendar.findYear(target);
    if (year) {
      if (year.year != cal.date.getFullYear()) {
        if (cal.hilitedYear) {
          Calendar.removeClass(cal.hilitedYear, "hilite");
        }
        Calendar.addClass(year, "hilite");
        cal.hilitedYear = year;
      else if (cal.hilitedYear) {
        Calendar.removeClass(cal.hilitedYear, "hilite");
      }
    else if (cal.hilitedYear) {
      Calendar.removeClass(cal.hilitedYear, "hilite");
    }
  }
  <fo