// Title: Tigra Calendar
// Description: See the demo at url
// URL: http://www.softcomplex.com/products/tigra_calendar/
// Version: 2.0 (Date only with year scrolling)
// Date: 06-04-2002 (mm-dd-yyyy)
// Author: Denis Gritcyuk <denis@softcomplex.com>
// Notes: Permission given to use this script in ANY kind of applications if
//    header lines are left unchanged.
// About us: Our company provides offshore IT consulting services.
//    Contact us at sales@softcomplex.com if you have any programming task you
//    want to be handled by professionals. Our typical hourly rate is $20.

// months as they appear in the calendar's title
var ARR_MONTHS = ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin",
		"Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"];
// week day titles as they appear on the calendar
var ARR_WEEKDAYS = ["Di", "Lu", "Ma", "Me", "Je", "Ve", "Sa"];
// day week starts from (normally 0-Mo or 1-Su)
var NUM_WEEKSTART = 1;
// if two digit year input dates after this year considered 20 century.
var NUM_CENTYEAR = 30;

var calendars = [];
var id_cal;
function set_new_month(n_month, n_cur) {
	var n_time = new Date(n_cur);
	n_time.setMonth(n_month);
	set_datetime(n_time.valueOf());
}
function set_datetime(n_datetime, b_close) {
//	alert(id_cal);
	var obj_calendar = calendars[id_cal];
//	popup(prop(calendars[0]));
	obj_calendar.target.value = obj_calendar.gen_date(new Date(n_datetime));
	if (b_close) document.getElementById('cal_div').style.display="none";
	else obj_calendar.popup(n_datetime);
}
function set_no_datetime() {
//	alert(id_cal);
document.getElementById('cal_div').style.display="none";
}

function calendar1(obj_target) {

	// assing methods
	this.gen_date = cal_gen_date1;
	this.prs_date = cal_prs_date1;
	this.popup    = cal_popup1;

	// validate input parameters
	if (!obj_target)
		return alert("Error calling the calendar: no target control specified");
	if (obj_target.value == null)
		return alert("Error calling the calendar: parameter specified is not valid tardet control");
	this.target = obj_target;
	
	// register in global collections
	this.id = calendars.length;
	calendars[this.id] = this;
}

function cal_popup1 (str_datetime) {

	this.dt_current = this.prs_date(str_datetime ? str_datetime : this.target.value);
//	if (!this.dt_current) return alert("Unknown datetime format: '" + str_datetime + "'.");
	if (!this.dt_current) this.dt_current = this.prs_date();

	var dt_cur = new Date(this.dt_current);
	// get same date in the previous year
	var dt_prev_year = new Date(this.dt_current);
	dt_prev_year.setFullYear(dt_prev_year.getFullYear() - 1);
	if (dt_prev_year.getDate() != this.dt_current.getDate())
		dt_prev_year.setDate(0);
	
	// get same date in the next year
	var dt_next_year = new Date(this.dt_current);
	dt_next_year.setFullYear(dt_next_year.getFullYear() + 1);
	if (dt_next_year.getDate() != this.dt_current.getDate())
		dt_next_year.setDate(0);

	// get same date in the previous month
	var dt_prev_month = new Date(this.dt_current);
	dt_prev_month.setMonth(dt_prev_month.getMonth() - 1);
	if (dt_prev_month.getDate() != this.dt_current.getDate())
		dt_prev_month.setDate(0);
	
	// get same date in the next month
	var dt_next_month = new Date(this.dt_current);
	dt_next_month.setMonth(dt_next_month.getMonth() + 1);
	if (dt_next_month.getDate() != this.dt_current.getDate())
		dt_next_month.setDate(0);
	
	// get first day to display in the grid for current month
	var dt_firstday = new Date(this.dt_current);
	dt_firstday.setDate(1);
	dt_firstday.setDate(1 - (7 + dt_firstday.getDay() - NUM_WEEKSTART) % 7);
	
	// html generation (feel free to tune it for your particular application)
	// print calendar header
	
	var obj_calwindow = document.getElementById('cal_div');
//	obj_calwindow.opener = window;

	var str_select_month = '<select name="curmonth" style="color:red; font-family:tahoma, verdana;font-size:8pt;font-weight:bold;" onChange="javascript:set_new_month(this.options[this.selectedIndex].value,'+dt_cur.valueOf()+')">';
	for (var im=0;im<12;im++) {
		str_select_month += '<option value="'+im+'"';
		if (im == this.dt_current.getMonth()) str_select_month += ' selected';
		str_select_month += '>'+ARR_MONTHS[im]+'</option>';
		}
	str_select_month += '</select>';

	id_cal = this.id;
	var str_buffer = new String (
	'<table class="clsOTable" cellspacing="0" border="0" width="100%">'+
	'<tr><td bgcolor="#ff0000">'+
	'<table width="100%"><table width="100%">'+
	'<tr>'+
		'<td bgcolor="#ff0000"><a href="javascript:set_datetime('+dt_prev_year.valueOf()+')" title="Année précédente" style="color:white;font-family:tahoma,verdana;font-size:12pt;font-weight:bold;text-decoration:none"><b>&lt; </b></a></td>'+
		'<td bgcolor="#ff0000"><a href="javascript:set_datetime('+dt_prev_month.valueOf()+')" title="Mois précédent" style="color:white;font-family:tahoma,verdana;font-size:8pt;text-decoration:none"><b>&lt;</b></a></td>'+
		'<td bgcolor="#ff0000" colspan="3" align="center"><b style="color:white;font-family:tahoma,verdana;font-size: 8pt">' + str_select_month + ' ' + this.dt_current.getFullYear()+'</b></td>'+
		'<td bgcolor="#ff0000" align="right"><a href="javascript:set_datetime('+dt_next_month.valueOf()+')" title="Mois suivant" style="color:white;font-family:tahoma,verdana;font-size:8pt;text-decoration:none"><b>&gt;</b></a></td>'+
		'<td bgcolor="#ff0000" align="right"><a href="javascript:set_datetime('+dt_next_year.valueOf()+')" title="Année suivante" style="color:white;font-family:tahoma,verdana;font-size:12pt;text-decoration:none"><b> &gt;</b></a></td>'+
		'<td bgcolor="#ffffff" align="right"><a href="javascript:set_no_datetime()" title="Exit" style="color:white;font-family:tahoma,verdana;font-size:12pt;text-decoration:none"><b style="color:#ff0000">x</b></a></td>'+
	'</tr></table><table cellspacing="1" cellpadding="3" border="0" width="100%"><tr>');
	var dt_current_day = new Date(dt_firstday);

	// print weekdays titles
	for (var n=0; n<7; n++)
		str_buffer += '<td bgcolor="#ffffe0" align="center"><span style="color:darkblue; font-family:tahoma, verdana;font-size:8pt">'+ARR_WEEKDAYS[(NUM_WEEKSTART+n)%7]+'</span></td>';
	str_buffer += '</tr>';

	// print calendar table
	var dt_current_day = new Date(dt_firstday);
	while (dt_current_day.getMonth() == this.dt_current.getMonth() ||
		dt_current_day.getMonth() == dt_firstday.getMonth()) {
		// print row heder
		str_buffer += '<tr>';
		for (var n_current_wday=0; n_current_wday<7; n_current_wday++) {
				if (dt_current_day.getDate() == this.dt_current.getDate() &&
					dt_current_day.getMonth() == this.dt_current.getMonth())
					// print current date
					str_buffer += '<td bgcolor="#FFB6C1" align="center" ';
				else if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6)
					// weekend days
					str_buffer += '<td bgcolor="#DBEAF5" align="center" ';
				else
					// print working days of current month
					str_buffer += '<td bgcolor="#e0ffff" align="center" ';

				if (dt_current_day.getMonth() == this.dt_current.getMonth())
					// print days of current month
					str_buffer += 'onClick="javascript:set_datetime('+dt_current_day.valueOf()+', true)" style="color: black; font-size: 8pt; font-family: tahoma, verdana;">';
				else 
					// print days of other months
					str_buffer += 'onClick="javascript:set_datetime('+dt_current_day.valueOf()+', true)" style="color: #808080; font-size: 8pt; font-family: tahoma, verdana;">';

				str_buffer += dt_current_day.getDate()+'</td>';
				dt_current_day.setDate(dt_current_day.getDate()+1);
		}
		// print row footer
		str_buffer += '</tr>';
	}
	// print calendar footer
	str_buffer +=
		'</table></tr></td></table>';
//popup(str_buffer);
	obj_calwindow.innerHTML = str_buffer;
	obj_calwindow.style.top = getPageTop(document.getElementById('img_cal')) - getHeight(obj_calwindow)/2;
	obj_calwindow.style.left = getPageLeft(document.getElementById('img_cal'));
	obj_calwindow.style.display = 'block';
//	obj_calwindow.focus();
}

// datetime generating function
function cal_gen_date1 (dt_datetime) {
	return (
		new String (
			(dt_datetime.getDate() < 10 ? '0' : '') + dt_datetime.getDate() + "/"
			+ (dt_datetime.getMonth() < 9 ? '0' : '') + (dt_datetime.getMonth() + 1) + "/"
			+ dt_datetime.getFullYear()
		)
	);
}

// datetime parsing function
function cal_prs_date1 (str_datetime) {
	// if no parameter specified return current timestamp
	if (!str_datetime)
		return (new Date());

	// if positive integer treat as milliseconds from epoch
	var re_num = /^\d+$/;
	if (re_num.exec(str_datetime))
		return (new Date(str_datetime));
		
	// else treat as date in string format
	var re_date = /^(\d+)\/(\d+)\/(\d+)/;
	if (re_date.exec(str_datetime)) {
	var n_year = Number(RegExp.$3);
	if (n_year < 100)
		n_year += (n_year < NUM_CENTYEAR ? 2000 : 1900);
		return (new Date (n_year, RegExp.$2-1, RegExp.$1));
	}
}



