
// Open Calendar
function openCalendar(event, id, start_date, options) {
	
	if ($("calendar")) {
		$("calendar").remove();
	}
	
	if (typeof(options) == "undefined") {
		options = { format: "middle", separator: "/" };
	}
	if (typeof(options.separator) == "undefined" || options.separator == "") {
		options.separator = "/";
	}
	
	// Create & Position Div
	var calendar = new Element("div", { id: "calendar" });
	$("bodyID").insert({ bottom: calendar });
	
	var x = Event.pointerX(event);
	if (calendar.getWidth() + Event.pointerX(event) > document.viewport.getWidth() + document.viewport.getScrollOffsets().left) {
		x = document.viewport.getWidth() - calendar.getWidth();
	}
	var y = Event.pointerY(event);
	if (calendar.getHeight() + Event.pointerY(event) > document.viewport.getHeight() + document.viewport.getScrollOffsets().top) {
		y = document.viewport.getHeight() - calendar.getHeight();
	}
	
	$("calendar").setStyle({ 
		left: x + "px",
		top: y + "px"
	});
	
	// Figure Out Date
	var d = new Date();
	var month;
	var day;
	var year;
	if (typeof(start_date) == "undefined" || start_date == "") {
		month = d.getMonth() + 1;
		day = d.getDate();
		year = d.getFullYear();
	} else {
		date = start_date.split(options.separator);
		if (typeof(options.format) == "undefined" || options.format == "" || options.format == "middle") {
			month = parseInt(date[0]);
			day = parseInt(date[1]);
			if (date[2].length < 4) {
				date[2] = "20" + date[2];
			}
			year = parseInt(date[2]);
		} else if (options.format == "little") {
			day = parseInt(date[0]);
			month = parseInt(date[1]);
			year = parseInt(date[2]);
		} else if (options.format == "big") {
			year = parseInt(date[0]);
			month = parseInt(date[1]);
			day = parseInt(date[2]);
		}
		d.setMonth(month - 1);
		d.setDate(day);
		/*if (year < 100) {
			year = "20" + year;
		}*/
		d.setYear(year);
	}
	
	drawCalendar(id, month, day, year, options);
	
	event.stopPropagation();
}

// Draw Calendar
function drawCalendar(id, month, day, year, options) {
	var d = new Date();
	month = parseInt(month);
	day = parseInt(day);
	year = parseInt(year);
	d.setMonth(month - 1);
	d.setDate(1);
	d.setYear(year);

	var html = "";
	//html += "<div id='calendar_x' onclick='$(\"calendar\").remove();'>[x]</a></div>";
	html += "<div id='calendar_select'>";
	html += "<span style='cursor:pointer;' onclick='drawCalendar(\"" + id + "\", " + month + ", " + day + ", " + (year - 1) + ", " + JSON.stringify(options) + ")' title='Previous Year'>&laquo;</span> ";
	html += "<span style='cursor:pointer;' onclick='drawCalendar(\"" + id + "\", " + (month > 1 ? month - 1 : 12) + ", " + day + ", " + (month > 1 ? year : year - 1) + ", " + JSON.stringify(options) + ")' title='Previous Month'>&lsaquo;</span>&nbsp;&nbsp;";
	html += "<select onchange='drawCalendar(\"" + id + "\", this.value, " + day + ", " + year + ", " + JSON.stringify(options) + ")'>";
	for (i = 1; i <= 12; i++) {
		html += "<option value='" + i + "'";
		if (i == month) html += " selected='selected'";
		html += ">" + getMonthName(i) + "</option>";
	}
	html += "</select> <select onchange='drawCalendar(\"" + id + "\", " + month + ", " + day + ", this.value, " + JSON.stringify(options) + ")'>";
	for (i = year - 10; i <= year + 10; i++) {
		html += "<option value='" + i + "'";
		if (i == year) html += " selected='selected'";
		html += ">" + i + "</option>";
	}
	
	html += "</select>&nbsp;&nbsp;";
	html += "<span style='cursor:pointer;' onclick='drawCalendar(\"" + id + "\", " + (month < 12 ? month + 1 : 1) + ", " + day + ", " + (month < 12 ? year : year + 1) + ", " + JSON.stringify(options) + ")' title='Next Month'>&rsaquo;</span> ";
	html += "<span style='cursor:pointer;' onclick='drawCalendar(\"" + id + "\", " + month + ", " + day + ", " + (year + 1) + ", " + JSON.stringify(options) + ")' title='Next Year'>&raquo;</span> ";
	html += "</div>";
	
	var blank = d.getDay();
	var daysInMonth = getDaysInMonth(month, year);
	var j = 1;

	html += "<table id='calendar_table'><tr><th>S</th><th>M</th><th>T</th><th>W</th><th>T</th><th>F</th><th>S</th></tr><tr>";
	for (i = 0; i < blank; i++) {
		html += "<td class='c3'></td>";
		j++;
	}

	var k = 1;
	while (k <= daysInMonth) {
		html += "<td class='c";
		if (k == day) html += "1";
		else html += 2;
		html += "' onclick='selectDate(\"" + id + "\", " + month + ", " + k + ", " + year + ", " + JSON.stringify(options) + ")'>" + k + "</td>";

		k++;
		j++;
		if (j > 7) {
			html += "</tr><tr>";
			j = 1;
		}
	}
	while (j > 1 && j <= 7) {
		html += "<td class='c3'></td>";
		j++;
	}
	html += "</tr></table>";
	
	$("calendar").innerHTML = html;
}

// Select Date
function selectDate(id, month, day, year, options) {
	var date = "";
	
	if (month < 10) {
		month = "0" + month;
	}
	if (day < 10) {
		day = "0" + day;
	}
	year = ("" + year).substring(2, 4);
	
	if (typeof(options.format) == "undefined" || options.format == "" || options.format == "middle") {
		date = month + options.separator + day + options.separator + year;
	} else if (options.format == "little") {
		date = day + options.separator + month + options.separator + year;
	} else if (options.format == "big") {
		date = year + options.separator + month + options.separator + day;
	}
	
	$(id).innerHTML = date;
	$("calendar").remove();
	
	if (typeof(options.callback) != "undefined") {
		eval(options.callback + "('" + date + "', '" + id.replace("date_", "") + "')");
	}
}

Event.observe(document, "click", function(e) {
	var target = (e && e.target) || (event && event.srcElement);
	var close = true;
	if (e || event) {
		while (target.id != "bodyID" && close) {
			if (target.id == "calendar") {
				close = false;
			} else {
				target = target.parentNode;
			}
		}
		if (close && $("calendar")) {
			$("calendar").remove();
		}
	}
});

function getMonthName(i) {
	var m = ['January','February','March','April','May','June','July','August','September','October','November','December'];
	return m[i - 1];
}
function getDayName(i) {
	var d = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
	return d[i - 1];
}
function getDaysInMonth(m, y) {
	var result;
	switch (parseInt(m)) {
		case 1: result = 31; break;
		case 2: 
			if (y % 400 == 0) result = 29;
			else if (y % 100 == 0) result = 28;
			else if (y % 4 == 0) result = 29;
			else result = 28;
			break;
		case 3: result = 31; break;
		case 4: result = 30; break;
		case 5: result = 31; break;
		case 6: result = 30; break;
		case 7: result = 31; break;
		case 8: result = 31; break;
		case 9: result = 30; break;
		case 10: result = 31; break;
		case 11: result = 30; break;
		case 12: result = 31; break;
	}
	return result;
}