
	_scalendar_with_filter = false;

	_scalendar_days = new Array('Su', 'M', 'Tu', 'W', 'Th', 'F', 'Sa');
	_scalendar_months = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');

	_scalendar_start_day = 1;

	_scalendar_selected = new Array();
	_scalendar_dates = new Array();


	function scalendar_draw_month ( month, year ) {
		// draws a scalendar month html
		// ----------------------------
		// function takes in the actual month number (1-12)
		// but then all date references further from this use the javascript version of the month (0-11)
	
		// first work out month data	

		// get first day of month
		var first = new Date(year, month-1, 1); // (javascript months are from 0 to 11)
		// work out start day
		var fday = first.getDay();
		// days in month
		var cdays = scalendar_days_in_month(first)


		// work out previous month values
		var pdays = 0;

		// is previous month needed on table?
		if (fday != _scalendar_start_day) {
			//alert('previous month required');

			// how many days are required?
			pdays = fday - _scalendar_start_day;
			if (pdays < 0) {
				pdays += 7;
			}

			// what day of previous month to start at
			var pmonth = scalendar_get_previous_month(first);
			pmonth.setDate(scalendar_days_in_month(pmonth) - pdays + 1); // days in month - required slots + 1

			//alert('starting at '+pmonth.toString()+' for '+pdays+' days');
		}


		// work out next month values
		var ndays = 0;

		// work out _scalendar_end_day
		var _scalendar_end_day = _scalendar_start_day - 1;
		if (_scalendar_end_day < 0) {
			_scalendar_end_day = 6;
		}

		// work out last day of current month
		var last = new Date(year, month-1, cdays);
		var lday = last.getDay();

		// is next month needed on table?
		if (lday != _scalendar_end_day) {
			//alert('next month required');

			// how many days are required
			ndays = _scalendar_end_day - lday;
			if (ndays < 0) {
				ndays += 7;
			}

			// get next month object to start at
			var nmonth = scalendar_get_next_month(first);
			nmonth.setDate(1);

			//alert('starting at '+nmonth.toString()+' for '+ndays+' days');
		}


		// now that we have the required month data, we can draw the scalendar!
		var d = '';

		// cell counters
		var column = 0;
		var row = 0;
		var dow = _scalendar_start_day;

		// get name to use for this calendar
		var cname = year+'-'+(month-1);

		// header
		d += '	<table><tr><td class="outer">';
		d += '		<table class="scalendar">';
		d += '			<tr class="title">';
		d += '				<th colspan="7">'+_scalendar_months[month-1]+' '+year+'</th>';
		d += '			</tr>';
		d += '			<tr class="days">';

		// day headings
		var i = _scalendar_start_day;
		while (true) {
			d += '<th>'+_scalendar_days[i]+'</th>';
			if (i == _scalendar_end_day) {
				break;
			}
			i++;
			if (i > 6) {
				i = 0;
			}
		}

		d += '			</tr>';
		d += '			<tr>';

		// go through previous month?
		if (pdays > 0) {
			for (var i = pmonth.getDate(); i < pmonth.getDate()+pdays; i++) {
				d += scalendar_draw_cell(i, dow, false, cname, pmonth.getFullYear()+'-'+pmonth.getMonth()+'-'+i);
				column++;
				dow++;
				if (dow == 7) {
					dow = 0;
				}
			}
		}

		// go through current month
		for (var i = 1; i <= cdays; i++) {
			d += scalendar_draw_cell(i, dow, true, cname, year+'-'+(month-1)+'-'+i);
			column++;
			if (column == 7) {
				d += '			</tr>';
				d += '			</tr>';
				column = 0;
				row++;
			}
			dow++;
			if (dow == 7) {
				dow = 0;
			}
		}

		// go through next month?
		if (ndays > 0) {
			for (var i = 1; i <= ndays; i++) {
				d += scalendar_draw_cell(i, dow, false, cname, nmonth.getFullYear()+'-'+nmonth.getMonth()+'-'+i);
				column++;
				dow++;
				if (dow == 7) {
					dow = 0;
				}
			}
		}

		// footer
		d += '			</tr>';
		d += '		</table>';
		d += '	</td></tr></table>';

		document.write(d);

	}


	// function for drawing a cell
	function scalendar_draw_cell ( i, dow, thismonth, cname, cdate ) {
		// work out class
		var c = '';
		if (!thismonth) {
			c += 'p';
		}
		if (dow == 0 || dow == 6) {
			c += 'w';
		}
		// is selected?
		var s = '';
		if (array_in_array(cdate, _scalendar_selected) != -1) {
			s = 's';
		}
		// add cell to array
		if (!array_key_exists(cdate, _scalendar_dates)) {
			_scalendar_dates[cdate] = new Array();
		}
		if (!array_key_exists(cname, _scalendar_dates[cdate])) {
			_scalendar_dates[cdate][cname] = new Array();
		}
		_scalendar_dates[cdate][cname]['class'] = c;
		// draw cell
		return '<td id="'+cname+'_'+cdate+'" class="'+s+c+'" onmouseover="scalendar_cell_over(this);" onmouseout="scalendar_cell_out(this);" onclick="scalendar_cell_click(this);">'+i+'</td>';
	}



	// functions for handling cell overs and outs
	function scalendar_cell_over ( obj ) {
		var a = obj.id.split('_');
		if (array_in_array(a[1], _scalendar_selected) != -1) { return; }
		obj.className = 'o'+_scalendar_dates[a[1]][a[0]]['class'];
	}
	function scalendar_cell_out ( obj ) {
		var a = obj.id.split('_');
		if (array_in_array(a[1], _scalendar_selected) != -1) { return; }
		obj.className = _scalendar_dates[a[1]][a[0]]['class'];
	}


	// function for handling cell click
	function scalendar_cell_click ( obj ) {
		var a = obj.id.split('_');
		var c = '';
		var k = array_in_array(a[1], _scalendar_selected);
		if (k == -1) {
			// is unselected, now select
			_scalendar_selected[_scalendar_selected.length] = a[1];
			c = 's';
		} else {
			// is selected, now unselect
			_scalendar_selected.splice(k, 1);
		}
		// loop through all instances of date and change class
		for (var i in _scalendar_dates[a[1]]) {
			if (typeof(_scalendar_dates[a[1]][i]) != 'object') { continue; }
			if (!document.getElementById(i+'_'+a[1])) { continue; }
			document.getElementById(i+'_'+a[1]).className = c + _scalendar_dates[a[1]][i]['class'];
		}
		// write dates to form
		scalendar_write_dates_to_form();
	}


	// function for handling submit
	function scalendar_submit () {
		if (_scalendar_selected.length < 1) {
			alert('You have not selected any dates.\nPlease select one or more dates and try again.');
			return;
		}
		scalendar_write_dates_to_form();
		if (_scalendar_with_filter) {
			document.getElementById('scalendar-form-filter').value = document.getElementById('scalendar-type-select').options[document.getElementById('scalendar-type-select').selectedIndex].value;
		}
		document.getElementById('scalendar-form').submit();
	}


	// function for updating form with dates
	function scalendar_write_dates_to_form () {
		var v = '';
		if (_scalendar_selected.length > 0) {
			var o = new Array();
			for (var i = 0; i < _scalendar_selected.length; i++) {
				o[o.length] = scalendar_proper_date(_scalendar_selected[i]);
			}
			v = o.join(',');
		}
		document.getElementById('scalendar-form-dates').value = v;
	}


	// function for use onload for selecting dates already in form
	function scalendar_get_dates_from_form () {
		if (!document.getElementById('scalendar-form-dates')) { return; }
		var a = document.getElementById('scalendar-form-dates').value;
		a = a.split(',');
		for (var j = 0; j < a.length; j++) {

			// skip if blank
			if (a[j] == '') { continue; }

			// get js version of date
			var d = scalendar_js_date(a[j]);

			// add to selected array if not already there
			if (array_in_array(d, _scalendar_selected) == -1) {
				_scalendar_selected[_scalendar_selected.length] = d;
			}

			// loop through all instances of date and change class
			for (var i in _scalendar_dates[d]) {
				if (typeof(_scalendar_dates[d][i]) != 'object') { continue; }
				if (!document.getElementById(i+'_'+d)) { continue; }
				document.getElementById(i+'_'+d).className = 's' + _scalendar_dates[d][i]['class'];
			}

		}
	}


	// function for returning the previous month object of a date object
	function scalendar_get_previous_month ( d ) {
		var month = d.getMonth();
		var year = d.getFullYear();
		var day = d.getDate();
		month--;
		if (month < 0) {
			month = 11;
			year--;
		}
		var a = new Date(year, month, day);
		return a;
	}

	// function for returning the next month object of a date object
	function scalendar_get_next_month ( d ) {
		var month = d.getMonth();
		var year = d.getFullYear();
		var day = d.getDate();
		month++;
		if (month > 11) {
			month = 0;
			year++;
		}
		var a = new Date(year, month, day);
		return a;
	}


	// function to work out how many days in the month of a date object
	function scalendar_days_in_month ( d ) {
		var month = d.getMonth();
		var year = d.getYear();
		var m = [31,28,31,30,31,30,31,31,30,31,30,31];
		if (month != 1) return m[month];
		if (year%4 != 0) return m[1];
		if (year%100 == 0 && year%400 != 0) return m[1];
		return m[1] + 1;
	} 

	// function to turn a mysql date in to a javascript format date
	function scalendar_js_date ( d ) {
		var a = d.split('-');
		var m = (a[1] * 1) - 1;
		return a[0]+'-'+m+'-'+(a[2]*1);
	}

	// function to turn a scalendar date in to a proper mysql format date
	function scalendar_proper_date ( d ) {
		var a = d.split('-');
		var m = (a[1] * 1) + 1;
		return a[0]+'-'+number_2_digits(m)+'-'+number_2_digits(a[2]);
	}

	// function to prepend 0 if needs be
	function number_2_digits ( n ) {
		n = n + '';
		if (n.length < 2) {
			return '0'+n;
		}
		return n;
	}


	// array functions
	function array_key_exists ( key, arr ) {
		for (var i in arr) {
			if (i == key) { return true; }
		}
		return false;
	}
	function array_in_array ( val, arr ) {
		for (var i in arr) {
			if (arr[i] == val) { return i; }
		}
		return -1;
	}



	// add onload

	add_load_event(scalendar_get_dates_from_form);

