
Calendar = function (firstDayOfWeek, dateStr, onSelected, onClose) {

	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.weekNumbers = true;
	this.firstDayOfWeek = 1;
	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;

	this.table = null;
	this.element = null;
	this.tbody = null;
	this.firstdayname = null;


	if (typeof Calendar._SDN == "undefined") {

		if (typeof Calendar._SDN_len == "undefined")
			Calendar._SDN_len = 1;
		var ar = new Array();
		for (var i = 8; i > 0;) {
			ar[--i] = Calendar._DN[i].substr(0, Calendar._SDN_len);
		}
		Calendar._SDN = ar;
	}
};


Calendar._C = null;

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) );

Calendar.is_opera = /opera/i.test(navigator.userAgent);

Calendar.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);



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;
};


Calendar.getElement = function(ev) {
	var f = Calendar.is_ie ? window.event.srcElement : ev.currentTarget;
	while (f.nodeType != 1 || /^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" + evname] = null;
	}
};

Calendar.createElement = function(type, parent) {
	var el = null;
	if (document.createElementNS) {
		el = document.createElementNS("http://www.w3.org/1999/xhtml", type);
	} else {
		el = document.createElement(type);
	}
	if (typeof parent != "undefined") {
		parent.appendChild(el);
	}
	return el;
};



Calendar._add_evs = function(el) {
	with (Calendar) {
		addEvent(el, "mouseover", dayMouseOver);
		addEvent(el, "mousedown", dayMouseDown);
		addEvent(el, "mouseout", dayMouseOut);
		if (is_ie) {
			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.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.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.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.callHandler();
			}
		}
	}
	with (Calendar) {
		removeEvent(document, "mouseup", tableMouseUp);
		removeEvent(document, "mouseover", tableMouseOver);
		removeEvent(document, "mousemove", tableMouseOver);
		_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 == 0 || Math.abs(el.navtype) > 2)))
			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 < 0) dx = 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");
		}
	}
	return Calendar.stopEvent(ev);
};

Calendar.tableMouseDown = function (ev) {
	if (Calendar.getTargetElement(ev) == Calendar.getElement(ev)) {
		return Calendar.stopEvent(ev);
	}
};

Calendar.dayMouseDown = function(ev) {
	var el = Calendar.getElement(ev);
	if (el.disabled) {
		return false;
	}
	var cal = el.calendar;
	cal.activeDiv = el;
	Calendar._C = cal;
	if (el.navtype != 300) with (Calendar) {
		if (el.navtype == 50) {
			el._current = el.innerHTML;
			addEvent(document, "mousemove", tableMouseOver);
		} else
			addEvent(document, Calendar.is_ie5 ? "mousemove" : "mouseover", tableMouseOver);
		addClass(el, "hilite active");
		addEvent(document, "mouseup", tableMouseUp);
	} 
	return Calendar.stopEvent(ev);
};

Calendar.dayMouseOver = function(ev) {
	var el = Calendar.getElement(ev);
	if (Calendar.isRelated(el, ev) || Calendar._C || el.disabled) {
		return false;
	}
	if (el.ttip) {
		if (el.ttip.substr(0, 1) == "_") {
			el.ttip = el.caldate.print(el.calendar.ttDateFormat) + el.ttip.substr(1);
		}
		el.calendar.tooltips.innerHTML = el.ttip;
	}
	if (el.navtype != 300) {
		Calendar.addClass(el, "hilite");
		if (el.caldate) {
			Calendar.addClass(el.parentNode, "rowhilite");
		}
	}
	return Calendar.stopEvent(ev);
};


Calendar.dayMouseOut = function(ev) {
	with (Calendar) {
		var el = getElement(ev);
		if (isRelated(el, ev) || _C || el.disabled)
			return false;
		removeClass(el, "hilite");
		if (el.caldate)
			removeClass(el.parentNode, "rowhilite");
		if (el.calendar)
			el.calendar.tooltips.innerHTML = _TT["SEL_DATE"];
		return stopEvent(ev);
	}
};


Calendar.cellClick = function(el, ev) {
	var cal = el.calendar;
	var closing = false;
	var newdate = false;
	var date = null;
	if (typeof el.navtype == "undefined") {
		if (cal.currentDateEl) {
			Calendar.removeClass(cal.currentDateEl, "selected");
			Calendar.addClass(el, "selected");
			closing = (cal.currentDateEl == el);
			if (!closing) {
				cal.currentDateEl = el;
			}
		}
		cal.date.setDateOnly(el.caldate);
		date = cal.date;
		var other_month = !(cal.dateClicked = !el.otherMonth);
		if (!other_month && !cal.currentDateEl)
			cal._toggleMultipleDate(new Date(date));
		else
			newdate = !el.disabled;
		if (other_month)
			cal._init(cal.firstDayOfWeek, date);
	} else {
		if (el.navtype == 200) {
			Calendar.removeClass(el, "hilite");
			cal.callCloseHandler();
			return;
		}
		date = new Date(cal.date);
		if (el.navtype == 0)
			date.setDateOnly(new Date()); 

		cal.dateClicked = false;
		var year = date.getFullYear();
		var mon = date.getMonth();
		function setMonth(m) {
			var day = date.getDate();
			var max = date.getMonthDays(m);
			if (day > max) {
				date.setDate(max);
			}
			date.setMonth(m);
		};
		switch (el.navtype) {
		    case -2:
			if (year > cal.minYear) {
				date.setFullYear(year - 1);
			}
			break;
		    case -1:
			if (mon > 0) {
				setMonth(mon - 1);
			} else if (year-- > cal.minYear) {
				date.setFullYear(year);
				setMonth(11);
			}
			break;
		    case 1:
			if (mon < 11) {
				setMonth(mon + 1);
			} else if (year < cal.maxYear) {
				date.setFullYear(year + 1);
				setMonth(0);
			}
			break;
		    case 2:
			if (year < cal.maxYear) {
				date.setFullYear(year + 1);
			}
			break;
		    case 50:
			var range = el._range;
			var current = el.innerHTML;
			for (var i = range.length; --i >= 0;)
				if (range[i] == current)
					break;
			if (ev && ev.shiftKey) {
				if (--i < 0)
					i = range.length - 1;
			} else if ( ++i >= range.length )
				i = 0;
			var newval = range[i];
			el.innerHTML = newval;
			cal.onUpdateTime();
			return;
		    case 0:

			if ((typeof cal.getDateStatus == "function") &&
			    cal.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate())) {
				return false;
			}
			break;
		}
		if (!date.equalsTo(cal.date)) {
			cal.setDate(date);
			newdate = true;
		} else if (el.navtype == 0)
			newdate = closing = true;
	}
	if (newdate) {
		ev && cal.callHandler();
	}
	if (closing) {
		Calendar.removeClass(el, "hilite");
		ev && cal.callCloseHandler();
	}
};



Calendar.prototype.create = function (_par) {
	var parent = null;
	if (_par) {
		parent = _par;
	}
	this.date = this.dateStr ? new Date(this.dateStr) : new Date();

	var table = Calendar.createElement("table");
	this.table = table;
	table.cellSpacing = 0;
	table.cellPadding = 0;
	table.calendar = this;
	Calendar.addEvent(table, "mousedown", Calendar.tableMouseDown);

	var div = Calendar.createElement("div");
	this.element = div;
	div.className = "calendar";
	div.appendChild(table);

	var thead = Calendar.createElement("thead", table);
	var cell = null;
	var row = null;

	var cal = this;

	var hh = function (text, cs, navtype) {
		cell = Calendar.createElement("td", row);
		cell.colSpan = cs;
		cell.className = "button";
		if (navtype != 0 && Math.abs(navtype) <= 2)
			cell.className += " nav";
		Calendar._add_evs(cell);
		cell.calendar = cal;
		cell.navtype = navtype;
		cell.innerHTML = "<div unselectable='on'>" + text + "</div>";
		return cell;
	};

	row = Calendar.createElement("tr", thead);
	var title_length = 6;
	(this.weekNumbers) && ++title_length;

	this.title = hh("", title_length + 1, 300);
	this.title.className = "title";

	row = Calendar.createElement("tr", thead);
	row.className = "headrow";

	this._nav_py = hh("&#x00ab;", 1, -2);
	this._nav_py.ttip = Calendar._TT["PREV_YEAR"];

	this._nav_pm = hh("&#x2039;", 1, -1);
	this._nav_pm.ttip = Calendar._TT["PREV_MONTH"];

	this._nav_now = hh(Calendar._TT["TODAY"], this.weekNumbers ? 4 : 3, 0);
	this._nav_now.ttip = Calendar._TT["TODAY"];

	this._nav_nm = hh("&#x203a;", 1, 1);
	this._nav_nm.ttip = Calendar._TT["NEXT_MONTH"];

	this._nav_ny = hh("&#x00bb;", 1, 2);
	this._nav_ny.ttip = Calendar._TT["NEXT_YEAR"];


	row = Calendar.createElement("tr", thead);
	row.className = "daynames";
	if (this.weekNumbers) {
		cell = Calendar.createElement("td", row);
		cell.className = "name wn";
		cell.innerHTML = Calendar._TT["WK"];
	}
	for (var i = 7; i > 0; --i) {
		cell = Calendar.createElement("td", row);
	}
	this.firstdayname = (this.weekNumbers) ? row.firstChild.nextSibling : row.firstChild;
	this._displayWeekdays();

	var tbody = Calendar.createElement("tbody", table);
	this.tbody = tbody;

	for (i = 6; i > 0; --i) {
		row = Calendar.createElement("tr", tbody);
		if (this.weekNumbers) {
			cell = Calendar.createElement("td", row);
		}
		for (var j = 7; j > 0; --j) {
			cell = Calendar.createElement("td", row);
			cell.calendar = this;
			Calendar._add_evs(cell);
		}
	}

	this.onSetTime = this.onUpdateTime = function() {};


	var tfoot = Calendar.createElement("tfoot", table);

	row = Calendar.createElement("tr", tfoot);
	row.className = "footrow";

	cell = hh(Calendar._TT["SEL_DATE"], this.weekNumbers ? 8 : 7, 300);
	cell.className = "ttip";
	this.tooltips = cell;

	div = Calendar.createElement("div", this.element);
	for (i = 0; i < Calendar._MN.length; ++i) {
		var mn = Calendar.createElement("div");
		mn.className = Calendar.is_ie ? "label-IEfix" : "label";
		mn.month = i;
		div.appendChild(mn);
	}

	div = Calendar.createElement("div", this.element);
	for (i = 12; i > 0; --i) {
		var yr = Calendar.createElement("div");
		yr.className = Calendar.is_ie ? "label-IEfix" : "label";
		div.appendChild(yr);
	}

	this._init(this.firstDayOfWeek, this.date);
	parent.appendChild(this.element);
};


Calendar.prototype._init = function (firstDayOfWeek, date) {
var y = date.getFullYear();
var today = new Date(),
		TY = today.getFullYear(),
		TM = today.getMonth(),
		TD = today.getDate();
	this.table.style.visibility = "hidden";
	var year = date.getFullYear();
	if (year < this.minYear) {
		year = this.minYear;
		date.setFullYear(year);
	} else if (year > this.maxYear) {
		year = this.maxYear;
		date.setFullYear(year);
	}
	this.firstDayOfWeek = firstDayOfWeek;
	this.date = new Date(date);
	var month = date.getMonth();
	var mday = date.getDate();
	var no_days = date.getMonthDays();


	date.setDate(1);
	var day1 = (date.getDay() - this.firstDayOfWeek) % 7;
	if (day1 < 0)
		day1 += 7;
	date.setDate(-day1);
	date.setDate(date.getDate() + 1);

	var row = this.tbody.firstChild;
	var ar_days = this.ar_days = new Array();
	var weekend = Calendar._TT["WEEKEND"];
	var dates = this.multiple ? (this.datesCells = {}) : null;
	for (var i = 0; i < 6; ++i, row = row.nextSibling) {
		var cell = row.firstChild;
		if (this.weekNumbers) {
			cell.className = "day wn";
			cell.innerHTML = date.getWeekNumber();
			cell = cell.nextSibling;
		}
		row.className = "daysrow";
		var hasdays = false, iday, dpos = ar_days[i] = [];
		for (var j = 0; j < 7; ++j, cell = cell.nextSibling, date.setDate(iday + 1)) {
			iday = date.getDate();
			var wday = date.getDay();
			cell.className = "day";
			cell.pos = i << 4 | j;
			dpos[j] = cell;
			var current_month = (date.getMonth() == month);
			if (!current_month) {
				if (this.showsOtherMonths) {
					cell.className += " othermonth";
					cell.otherMonth = true;
				} else {
					cell.className = "emptycell";
					cell.innerHTML = "&nbsp;";
					cell.disabled = true;
					continue;
				}
			} else {
				cell.otherMonth = false;
				hasdays = true;
			}
			cell.disabled = false;
			cell.innerHTML = this.getDateText ? this.getDateText(date, iday) : iday;
			if (dates)
				dates[date.print("%Y%m%d")] = cell;
			if (this.getDateStatus) {
				var status = this.getDateStatus(date, year, month, iday);
				if (this.getDateToolTip) {
					var toolTip = this.getDateToolTip(date, year, month, iday);
					if (toolTip)
						cell.title = toolTip;
				}
				if (status === true) {
					cell.className += " disabled";
					cell.disabled = true;
				} else {
					if (/disabled/i.test(status))
						cell.disabled = true;
					cell.className += " " + status;
				}
			}
			if (!cell.disabled) {
				var dy = date.getDayOfYear();
				cell.caldate = new Date(date);
				cell.ttip = "_";
				if (!this.multiple && current_month
				    && iday == mday && this.hiliteToday) {
					this.currentDateEl = cell;
				}
				if (date.getFullYear() == TY &&
				    date.getMonth() == TM &&
				    iday == TD) {
					cell.className += " today";
				}
				if (weekend.indexOf(wday.toString()) != -1)
					cell.className += cell.otherMonth ? " oweekend" : " weekend";
	//	**** - marcar las celdas deseadas en un color
				switch (y) {
		    		case 2006:
							if ( dy == 38 | dy == 39 | dy == 40 | dy == 41 | dy == 42 )	
				  					cell.className += " roj";
							if ( dy == 93 | dy == 94 | dy == 95 | dy == 96 )	
				  					cell.className += " ama";
							if ( dy == 107 | dy == 113 ) 
				  					cell.className += " ver";
							if ( dy == 237 | dy == 238 | dy == 239 | dy == 240 | dy == 241 | dy == 242 | dy == 243 | dy == 244 | dy == 245 )	
									cell.className += " ver";
							if ( dy == 268 | dy == 269 | dy == 270 | dy == 271 | dy == 272 )	
				  					cell.className += " fuc";							
					break;
		    		case 2007:
							if ( dy == 37 | dy == 38 | dy == 39 | dy == 40 | dy == 41 )	
				  					cell.className += " roj";
							if ( dy == 99 | dy == 105 )
									cell.className += " ver";
							if ( dy == 106 | dy == 107 | dy == 108 | dy == 109 )	
				  					cell.className += " ama";
							if ( dy == 133 | dy == 134 | dy == 135 | dy == 136 | dy == 137 | dy == 138 )	
				  					cell.className += " azu";
							if ( dy == 236 | dy == 237 | dy == 238 | dy == 239 | dy == 240 | dy == 241 | dy == 242 | dy == 243 | dy == 244 )	
				  					cell.className += " ver";
							if ( dy == 274 | dy == 275 | dy == 276 | dy == 277 | dy == 278 )	
				  					cell.className += " lil";
					break;
		    		case 2008:
							if ( dy == 1 | dy == 6 | dy == 79 | dy == 80 | dy == 81 | dy == 84 | dy == 121 | dy == 227 | dy == 282 | dy == 306 | dy == 341 | dy == 343 | dy == 360 )
									cell.className += cell.otherMonth ? " oweekend" : " weekend";
							if ( dy == 36 | dy == 37 | dy == 38 | dy == 39 | dy == 40 )	
				  					cell.className += " roj";
							if ( dy == 85 )
									cell.className += " ver";
							if ( dy == 91 | dy == 92 | dy == 93 | dy == 94 )	
				  					cell.className += " azu";
							if ( dy == 119 | dy == 120 | dy == 121 | dy == 122 )	
				  					cell.className += " nar";
							if ( dy == 242 | dy == 243 | dy == 244 | dy == 245 | dy == 246 | dy == 247 | dy == 248 | dy == 249 | dy == 250 )	
				  					cell.className += " ver";
							if ( dy == 273 | dy == 274 | dy == 275 | dy == 276 | dy == 277 )	
				  					cell.className += " lil";
					break;
					case 2009:
							if ( dy == 1 | dy == 6 | dy == 78 | dy == 98 | dy == 99 | dy == 102 | dy == 120 | dy == 226 | dy == 281 | dy == 284 | dy == 342 | dy == 359 )
									cell.className += cell.otherMonth ? " oweekend" : " weekend";
							if ( dy == 41 | dy == 42 | dy == 43 | dy == 44 )	
				  					cell.className += " mor";
							if ( dy == 89 | dy == 90 | dy == 91 | dy == 92 )	
				  					cell.className += " azu2";
							if ( dy == 103 | dy == 109 )
									cell.className += " ver2";
							if ( dy == 240 | dy == 241 | dy == 242 | dy == 243 | dy == 244 | dy == 245 | dy == 246 | dy == 247 | dy == 248 )	
				  					cell.className += " ver2";
							if ( dy == 271 | dy == 272 | dy == 273 | dy == 274 | dy == 275 )	
				  					cell.className += " lil2";
					break;
					case 2010:
							if ( dy == 1 | dy == 6 | dy == 78 | dy == 91 | dy == 94 | dy == 120 | dy == 226 | dy == 281 |dy == 284 | dy == 305 | dy == 340 |dy == 342 | dy == 359 )
									cell.className += cell.otherMonth ? " oweekend" : " weekend";
							if ( dy == 40 | dy == 41 | dy == 42 | dy == 43 )	
				  					cell.className += " mor";
							if ( dy == 95 | dy == 96 | dy == 97 | dy == 98 )	
				  					cell.className += " nar2";
							if ( dy == 270 | dy == 271 | dy == 272 | dy == 273 | dy == 274 )	
				  					cell.className += " ver3";
					break;
				}
			}
		}
		if (!(hasdays || this.showsOtherMonths))
			row.className = "emptyrow";
	}
	// **** - mostrar la imagen superior de la tabla
	// this.title.innerHTML = Calendar._MN[month] + ", " + year;
	/*switch (year) {
		case 2006:
			switch (month){
				case 0:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/January06.jpg'>";
				break;
				case 1:
 				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/February06.jpg'>";
				break;
				case 2:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/March06.jpg'>";
				break;
				case 3:
 				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/April06.jpg'>";
				break;
				case 4:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/May06.jpg'>";
				break;
				case 5:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/June06.jpg'>";
				break;
				case 6:
 				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/July06.jpg'>";
				break;
				case 7:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/August06.jpg'>";
				break;
				case 8:
 				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/September06.jpg'>";
				break;
				case 9:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/October06.jpg'>";
				break;
				case 10:
 				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/November06.jpg'>";
				break;
				case 11:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/December06.jpg'>";
				break;
			}
		break;
		case 2007:
			switch (month){
				case 0:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/January07.jpg'>";
				break;
				case 1:
 				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/February07.jpg'>";
				break;
				case 2:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/March07.jpg'>";
				break;
				case 3:
 				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/April07.jpg'>";
				break;
				case 4:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/May07.jpg'>";
				break;
				case 5:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/June07.jpg'>";
				break;
				case 6:
 				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/July07.jpg'>";
				break;
				case 7:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/August07.jpg'>";
				break;
				case 8:
 				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/September07.jpg'>";
				break;
				case 9:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/October07.jpg'>";
				break;
				case 10:
 				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/November07.jpg'>";
				break;
				case 11:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/December07.jpg'>";
				break;
			}
		break;
		case 2008:
			switch (month){
				case 0:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/January08.jpg'>";
				break;
				case 1:
 				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/February08.jpg'>";
				break;
				case 2:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/March08.jpg'>";
				break;
				case 3:
 				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/April08.jpg'>";
				break;
				case 4:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/May08.jpg'>";
				break;
				case 5:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/June08.jpg'>";
				break;
				case 6:
 				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/July08.jpg'>";
				break;
				case 7:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/August08.jpg'>";
				break;
				case 8:
 				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/September08.jpg'>";
				break;
				case 9:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/October08.jpg'>";
				break;
				case 10:
 				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/November08.jpg'>";
				break;
				case 11:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/December08.jpg'>";
				break;
			}
		break;
		case 2009:
			switch (month){
				case 0:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/January09.jpg'>";
				break;
				case 1:
 				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/February09.jpg'>";
				break;
				case 2:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/March09.jpg'>";
				break;
				case 3:
 				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/April09.jpg'>";
				break;
				case 4:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/May09.jpg'>";
				break;
				case 5:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/June09.jpg'>";
				break;
				case 6:
 				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/July09.jpg'>";
				break;
				case 7:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/August09.jpg'>";
				break;
				case 8:
 				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/September09.jpg'>";
				break;
				case 9:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/October09.jpg'>";
				break;
				case 10:
 				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/November09.jpg'>";
				break;
				case 11:
				  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/December09.jpg'>";
				break;
			}
		break;
	}*/
	

	switch (month){
		case 0:
		  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/January" + Right(year,2)+ ".jpg'>";
		break;
		case 1:
		  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/February" + Right(year,2)+ ".jpg'>";
		break;
		case 2:
		  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/March" + Right(year,2)+ ".jpg'>";
		break;
		case 3:
		  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/April" + Right(year,2)+ ".jpg'>";
		break;
		case 4:
		  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/May" + Right(year,2)+ ".jpg'>";
		break;
		case 5:
		  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/June" + Right(year,2)+ ".jpg'>";
		break;
		case 6:
		  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/July" + Right(year,2)+ ".jpg'>";
		break;
		case 7:
		  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/August" + Right(year,2)+ ".jpg'>";
		break;
		case 8:
		  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/September" + Right(year,2)+ ".jpg'>";
		break;
		case 9:
		  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/October" + Right(year,2)+ ".jpg'>";
		break;
		case 10:
		  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/November" + Right(year,2)+ ".jpg'>";
		break;
		case 11:
		  this.title.innerHTML = "<img src='http://www.vivesceramica.com/ftp_customer/calendario/December" + Right(year,2)+ ".jpg'>";
		break;
	}
	
	
	
	
	this.onSetTime();
	this.table.style.visibility = "visible";
	this._initMultipleDates();

};

Calendar.prototype._initMultipleDates = function() {
	if (this.multiple) {
		for (var i in this.multiple) {
			var cell = this.datesCells[i];
			var d = this.multiple[i];
			if (!d)
				continue;
			if (cell)
				cell.className += " selected";
		}
	}
};

Calendar.prototype._toggleMultipleDate = function(date) {
	if (this.multiple) {
		var ds = date.print("%Y%m%d");
		var cell = this.datesCells[ds];
		if (cell) {
			var d = this.multiple[ds];
			if (!d) {
				Calendar.addClass(cell, "selected");
				this.multiple[ds] = date;
			} else {
				Calendar.removeClass(cell, "selected");
				delete this.multiple[ds];
			}
		}
	}
};


Calendar.prototype.setDate = function (date) {
	if (!date.equalsTo(this.date)) {
		this._init(this.firstDayOfWeek, date);
	}
};


Calendar.prototype.setDateStatusHandler = Calendar.prototype.setDisabledHandler = function (unaryFunction) {
	this.getDateStatus = unaryFunction;
};


Calendar.prototype.setRange = function (a, z) {
	this.minYear = a;
	this.maxYear = z;
};


Calendar.prototype.callHandler = function () {
	if (this.onSelected) {
		this.onSelected(this, this.date.print(this.dateFormat));
	}
};


Calendar.prototype.callCloseHandler = function () {
	if (this.onClose) {
		this.onClose(this);
	}
	this.hideShowCovered();
};


Calendar.prototype.reparent = function (new_parent) {
	var el = this.element;
	el.parentNode.removeChild(el);
	new_parent.appendChild(el);
};


Calendar.prototype.show = function () {
	var rows = this.table.getElementsByTagName("tr");
	for (var i = rows.length; i > 0;) {
		var row = rows[--i];
		Calendar.removeClass(row, "rowhilite");
		var cells = row.getElementsByTagName("td");
		for (var j = cells.length; j > 0;) {
			var cell = cells[--j];
			Calendar.removeClass(cell, "hilite");
			Calendar.removeClass(cell, "active");
		}
	}
	this.element.style.display = "block";
	this.hidden = false;
//	this.hideShowCovered();
};


Calendar.prototype.showAt = function (x, y) {
	var s = this.element.style;
	s.left = x + "px";
	s.top = y + "px";
	this.show();
};


Calendar.prototype.showAtElement = function (el, opts) {
	var self = this;
	var p = Calendar.getAbsolutePos(el);
	if (!opts || typeof opts != "string") {
		this.showAt(p.x, p.y + el.offsetHeight);
		return true;
	}
	function fixPosition(box) {
		if (box.x < 0)
			box.x = 0;
		if (box.y < 0)
			box.y = 0;
		var cp = document.createElement("div");
		var s = cp.style;
		s.position = "absolute";
		s.right = s.bottom = s.width = s.height = "0px";
		document.body.appendChild(cp);
		var br = Calendar.getAbsolutePos(cp);
		document.body.removeChild(cp);
		if (Calendar.is_ie) {
			br.y += document.body.scrollTop;
			br.x += document.body.scrollLeft;
		} else {
			br.y += window.scrollY;
			br.x += window.scrollX;
		}
		var tmp = box.x + box.width - br.x;
		if (tmp > 0) box.x -= tmp;
		tmp = box.y + box.height - br.y;
		if (tmp > 0) box.y -= tmp;
	};
	this.element.style.display = "block";
};


Calendar.prototype.setDateFormat = function (str) {
	this.dateFormat = str;
};


Calendar.prototype.setTtDateFormat = function (str) {
	this.ttDateFormat = str;
};

Calendar.prototype.parseDate = function(str, fmt) {
	if (!fmt)
		fmt = this.dateFormat;
	this.setDate(Date.parseDate(str, fmt));
};


Calendar.prototype._displayWeekdays = function () {
	var fdow = this.firstDayOfWeek;
	var cell = this.firstdayname;
	var weekend = Calendar._TT["WEEKEND"];
	for (var i = 0; i < 7; ++i) {
		cell.className = "day name";
		var realday = (i + fdow) % 7;
		if (weekend.indexOf(realday.toString()) != -1) {
			Calendar.addClass(cell, "weekend");
		}
		cell.innerHTML = Calendar._SDN[(i + fdow) % 7];
		cell = cell.nextSibling;
	}
};


Calendar.prototype._dragStart = function (ev) {
	if (this.dragging) {
		return;
	}
	this.dragging = true;
	var posX;
	var posY;
	if (Calendar.is_ie) {
		posY = window.event.clientY + document.body.scrollTop;
		posX = window.event.clientX + document.body.scrollLeft;
	} else {
		posY = ev.clientY + window.scrollY;
		posX = ev.clientX + window.scrollX;
	}
	var st = this.element.style;
	this.xOffs = posX - parseInt(st.left);
	this.yOffs = posY - parseInt(st.top);
};




Date._MD = new Array(31,28,31,30,31,30,31,31,30,31,30,31);


Date.SECOND = 1000;
Date.MINUTE = 60 * Date.SECOND;
Date.HOUR   = 60 * Date.MINUTE;
Date.DAY    = 24 * Date.HOUR;
Date.WEEK   =  7 * Date.DAY;


Date.prototype.getMonthDays = function(month) {
	var year = this.getFullYear();
	if (typeof month == "undefined") {
		month = this.getMonth();
	}
	if (((0 == (year%4)) && ( (0 != (year%100)) || (0 == (year%400)))) && month == 1) {
		return 29;
	} else {
		return Date._MD[month];
	}
};


Date.prototype.getDayOfYear = function() {
	var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
	var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0);
	var time = now - then;
	return Math.floor(time / Date.DAY);
};


Date.prototype.getWeekNumber = function() {
	var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
	var DoW = d.getDay();
	d.setDate(d.getDate() - (DoW + 6) % 7 + 3); 
	var ms = d.valueOf(); 
	d.setMonth(0);
	d.setDate(4); 
	return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1;
};


Date.prototype.equalsTo = function(date) {
	return ((this.getFullYear() == date.getFullYear()) &&
		(this.getMonth() == date.getMonth()) &&
		(this.getDate() == date.getDate()) &&
		(this.getHours() == date.getHours()) &&
		(this.getMinutes() == date.getMinutes()));
};


Date.prototype.setDateOnly = function(date) {
	var tmp = new Date(date);
	this.setDate(1);
	this.setFullYear(tmp.getFullYear());
	this.setMonth(tmp.getMonth());
	this.setDate(tmp.getDate());
};


Date.prototype.print = function (str) {
	var m = this.getMonth();
	var d = this.getDate();
	var y = this.getFullYear();
	var wn = this.getWeekNumber();
	var w = this.getDay();
	var s = {};
	var hr = this.getHours();
	var pm = (hr >= 12);
	var ir = (pm) ? (hr - 12) : hr;
	var dy = this.getDayOfYear();
	if (ir == 0)
		ir = 12;
	var min = this.getMinutes();
	var sec = this.getSeconds();

	
	// **** - mostrar texto en zona inferior de la tabla
	switch (y) {
		    case 2006:
			s["%J"] = Calendar._DES2006[dy];
			break;
			case 2007:
			s["%J"] = Calendar._DES2007[dy];
			break;
		    case 2008:
			s["%J"] = Calendar._DES2008[dy];
			break;
			case 2009:
			s["%J"] = Calendar._DES2009[dy];
			break;
			case 2010:
			s["%J"] = Calendar._DES2010[dy];
			break;

		}
	

	var re = /%./g;
	if (!Calendar.is_ie5 && !Calendar.is_khtml)
		return str.replace(re, function (par) { return s[par] || par; });

	var a = str.match(re);
	for (var i = 0; i < a.length; i++) {
		var tmp = s[a[i]];
		if (tmp) {
			re = new RegExp(a[i], 'g');
			str = str.replace(re, tmp);
		}
	}

	return str;
};

function Left(str, n){
	if (n <= 0)
	    return "";
	else if (n > String(str).length)
	    return str;
	else
	    return String(str).substring(0,n);
}
function Right(str, n){
    if (n <= 0)
       return "";
    else if (n > String(str).length)
       return str;
    else {
       var iLen = String(str).length;
       return String(str).substring(iLen, iLen - n);
    }
}

