/*
 * Control.DatePicker
 * 
 * Transforms an ordinary input textbox into an interactive date picker.
 * When the textbox is clicked (or the down arrow is pressed), a calendar
 * appears that the user can browse through and select a date.
 *
 * Features:
 *  - Allows user to specify a date format
 *  - Easy to localize
 *  - Customizable by CSS
 *
 */
 

if (window.Control == undefined) Control = {};

var http = createRequestObject(); 
var hourCellsDisable = new Array();
var hourCellsDisable1 = new Array();
var hourCellsDisable2 = new Array();
var activeDisable;
			
/*function checkTimes(theFile){
	var isValid = true;
	
	var theDay = document.getElementById('date_picker').value;
	var startT = document.getElementById('time_start').value;
	var endT = document.getElementById('time_end').value;
	
	var endTpm = (endT.slice(-2) == "PM"?Number(endT.substr(0,2))+12:endT.substr(0,2));
	//alert(endTpm);
	var startTpm = (startT.slice(-2) == "PM"?Number(startT.substr(0,2))+12:startT.substr(0,2));
	//var st = startT.slice(0,2);
	//var et = endT.slice(0,2);
	var st = startTpm;
	var et = endTpm;
	var endDay = "";
//alert(st);
//alert(et);
if(et<st){
		endDay = new Date( theDay.substr(-4), theDay.substr(0,2)-01, theDay.substr(3,2));
		endDay.setDate(endDay.getDate()+1);
		endDay = endDay.getMonth()+1+"-"+endDay.getDate()+"-"+endDay.getFullYear();
	}
		//alert(endDay);

	if ( (document.getElementById('time_start').value != "") &&
		(document.getElementById('time_end').value != "") ){
		for(var i = st; i <= et; i++) {
			for(var x = 0; x < hourCellsDisable.length; x++) {
				if(hourCellsDisable[x] == i) {
					isValid = false;
				}
			}
		}
		if(!isValid){alert("Please select start and end values from contiguous available times."); } else		
		if(startT==endT){alert("Please select different start and end times."); }
		//else
		//if(et<st){alert("Please select an end time greater than the start time."); }
		else {
			//alert(theFile.substr(0,3));
			if( theFile.substr(0,3) == 'rec' ){
				var theSet = theFile.slice(-1);
				openName("recording_reservation.php?time_start="+startT+"&theDay="+theDay+"&time_end="+endT+"&theSet="+theSet+"&endDay="+endDay);
			} else {
				var theStudio = theFile.slice(-1);
				//alert(theStudio);
				openName("rehearsal_reservation.php?time_start="+startT+"&theDay="+theDay+"&time_end="+endT+"&theStudio="+theStudio+"&endDay="+endDay);
			}
		}
	}
}*/

function checkTimes(theFile){
	var isValid = true;
	
	var theDay = document.getElementById('date_picker').value;

	endDay = new Date( theDay.substr(-4), theDay.substr(0,2)-01, theDay.substr(3,2));
	endDay.setDate(endDay.getDate()+1);
	endDay = (endDay.getMonth() < 10?'0'+(endDay.getMonth()+1):endDay.getMonth()+1)+"-"+(endDay.getDate() < 10?'0'+endDay.getDate():endDay.getDate())+"-"+endDay.getFullYear();

	if( theFile.substr(0,3) == 'rec' ){
		var theSet = theFile.slice(-1);
		openName("https://www.soundroomstudios.com/SoundRoomStudios/recording_reservation_times.php?theDay="+theDay+"&theSet="+theSet+"&nextDay="+endDay);
	} else {
		var theStudio = theFile.slice(-1);
		openName("https://www.soundroomstudios.com/SoundRoomStudios/rehearsal_reservation_times.php?theDay="+theDay+"&theStudio="+theStudio+"&nextDay="+endDay);
	}
}

function checkTimesNA(theFile, theClient){
	var isValid = true;
	var theDay = document.getElementById('date_picker').value;

	endDay = new Date( theDay.substr(-4), theDay.substr(0,2)-01, theDay.substr(3,2));
	endDay.setDate(endDay.getDate()+1);
	endDay = (endDay.getMonth() < 10?'0'+(endDay.getMonth()+1):endDay.getMonth()+1)+"-"+(endDay.getDate() < 10?'0'+endDay.getDate():endDay.getDate())+"-"+endDay.getFullYear();

	if( theFile.substr(0,3) == 'rec' ){
		var theSet = theFile.slice(-1);
		openName("https://www.soundroomstudios.com/SoundRoomStudios/recording_reservation_timesNA.php?theDay="+theDay+"&theSet="+theSet+"&nextDay="+endDay+"&nu="+theClient);
	} else {
		var theStudio = theFile.slice(-1);
		openName("https://www.soundroomstudios.com/SoundRoomStudios/rehearsal_reservation_timesNA.php?theDay="+theDay+"&theStudio="+theStudio+"&nextDay="+endDay+"&nu="+theClient);
	}
}


function getBookingTimes(){
	// allow disabling of times - get from db
	
	http.onreadystatechange = function handleTimes(){
		/* Make sure that the transaction has finished. The XMLHttpRequest object 
			has a property called readyState with several states:
			0: Uninitialized
			1: Loading
			2: Loaded
			3: Interactive
			4: Finished */
		if(http.readyState == 4){ //Finished loading the response
			/* We have got the response from the server-side script,
				let's see just what it was. using the responseText property of 
				the XMLHttpRequest object. */
			if  (http.status == 200) {
				var line = http.responseText;
				//alert(line);
				hourCellsDisable = line.split(',');
				//alert(hourCellsDisable);
			}
	
		}
	}
	http.open('get', 'getTimes.php?theDay=' + document.getElementById('date_picker').value + '&theStudio=' + document.getElementById('studio_name').value);
	//http.open('get', 'getTimes.php');
	http.send(null);
	
}



Control.DatePicker = Class.create();
Control.DatePicker.activePicker = null;
Control.DatePicker.prototype = {
	initialize: function(element, options) {
		//getBookingTimes();

		this.element = $(element);
		this.i18n = new Control.DatePicker.i18n(options && options.locale ? options.locale : 'en_US');
		options = this.i18n.inheritOptions(options);
		options = Object.extend({
						datePicker: true,
						timePicker: false
					}, options || {});

		this.handlers = { onClick: options.onClick,
				onHover: options.onHover,
				onSelect: options.onSelect };

		this.options = Object.extend(options || {}, {
				onClick: this.pickerClicked.bind(this),
				onHover: this.dateHover.bind(this),
				onSelect: this.datePicked.bind(this)
			});

		if (this.options.timePicker && this.options.datePicker)
			this.options.currentFormat = this.options.dateTimeFormat;
		else if (this.options.timePicker)
			this.options.currentFormat = this.options.timeFormat;
		else
			this.options.currentFormat = this.options.dateFormat;
//		this.options.currentFormat = this.options.timePicker ? this.options.dateTimeFormat : this.options.dateFormat;
		this.options.date = DateFormat.parseFormat(this.element.value, this.options.currentFormat);

		// Lazy load to avoid excessive CPU usage with lots of controls on one page
		this.datepicker = null;

		this.originalValue = null;
		this.hideTimeout = null;

		if (this.options.icon) {
			this.element.style.background = 'url('+this.options.icon+') right center no-repeat #FFF';
			// Prevent text writing over icon
			this.element.style.paddingRight = '20px';
		}
		Event.observe(this.element, 'click', this.togglePicker.bindAsEventListener(this));

		this.hidePickerListener = this.delayedHide.bindAsEventListener(this);
		Event.observe(this.element, 'keydown', this.keyHandler.bindAsEventListener(this));
		Event.observe(document, 'keydown', this.docKeyHandler.bindAsEventListener(this));

		this.pickerActive = false;
	},
	tr: function(str) {
		return this.i18n.tr(str);
	},
	delayedHide: function(e) {
		this.hideTimeout = setTimeout(this.hide.bind(this), 100);
	},
	pickerClicked: function() {
		if (this.hideTimeout) {
			clearTimeout(this.hideTimeout);
			this.hideTimeout = null;
		}
		if (this.handlers.onClick)
			this.handlers.onClick();
	},
	datePicked: function(date) {
		theDate = DateFormat.format(date, this.options.currentFormat);
		if(theDate.slice(0,2) > 12){
			var thePrefix = '';
			if(theDate.slice(0,2) <= 21){thePrefix = "0";}
			this.element.value = theDate.slice(0,2)-12+theDate.slice(2,5)+" PM";
			this.element.value = thePrefix + this.element.value;
		//} else if(theDate.slice(0,2) == 12){
		//	this.element.value = theDate+" PM";
		} else {
			this.element.value = DateFormat.format(date, this.options.currentFormat);
		}
		this.element.focus();
		this.hide();
		if (this.handlers.onSelect)
			this.handlers.onSelect(date);
		if (this.element.onchange)
			this.element.onchange();
	},
	dateHover: function(date) {
		if (this.hideTimeout) {
			clearTimeout(this.hideTimeout);
			this.hideTimeout = null;
		}
		if (this.pickerActive) {
			this.element.value = DateFormat.format(date, this.options.currentFormat);
			if (this.handlers.onHover)
				this.handlers.onHover(date);
		}
	},
	togglePicker: function(e) {
		if (this.pickerActive) {
			this.element.value = this.originalValue;
			this.hide();
		} else {
			this.show();
		}
		Event.stop(e);
		return false;
	},
	docKeyHandler: function(e) {
		if (e.keyCode == Event.KEY_ESC)
			if (this.pickerActive) {
				this.element.value = this.originalValue;
				this.hide();
			}

	},
	keyHandler: function(e) {
		switch (e.keyCode) {
			case Event.KEY_ESC:
				if (this.pickerActive)
					this.element.value = this.originalValue;
			case Event.KEY_TAB:
				this.hide();
				return;
			case Event.KEY_DOWN:	
				if (!this.pickerActive) {
					this.show();
					Event.stop(e);
				}
		}
		if (this.pickerActive)
			return false;
	},
	hide: function() {
		if(this.pickerActive && !this.element.disabled) {
			this.datepicker.releaseKeys();
			Element.remove(this.datepicker.element);
			Event.stopObserving(document, 'click', this.hidePickerListener, true);
			this.pickerActive = false;
			Control.DatePicker.activePicker = null;
		}
	},
	scrollOffset: function(element) {
		var valueT = 0, valueL = 0;
		do {
			if (element.tagName == 'BODY') break;
			valueT += element.scrollTop  || 0;
			valueL += element.scrollLeft || 0;
			element = element.parentNode;
		} while (element);
		return Element._returnOffset(valueL, valueT);
	},
	show: function () {
		if (!this.pickerActive) {
			if (Control.DatePicker.activePicker)
				Control.DatePicker.activePicker.hide();
			this.element.focus();
			if (!this.datepicker)
				this.datepicker = new Control.DatePickerPanel(this.options);
			this.originalValue = this.element.value;

			// Find real page position
			/*
			var pos = this.element.cumulativeOffset();
			if (!/MSIE 8/.test(navigator.userAgent)) {
				// IE seems to account for scrollTop in offsetTop already
				var scroll = this.scrollOffset(this.element);
				pos[0] -= scroll[0] + document.body.scrollTop;
				pos[1] -= scroll[1] + document.body.scrollLeft;
			}
			*/
			var pos = Position.positionedOffset(this.element);
			var dim = Element.getDimensions(this.element);
			var pickerTop = /MSIE/.test(navigator.userAgent) ? (pos[1] + dim.height) + 'px' : (pos[1] + dim.height - 1) + 'px';
			this.datepicker.element.style.position = 'absolute';
			this.datepicker.element.style.top = pickerTop;
			this.datepicker.element.style.left = pos[0] + 'px';
			this.datepicker.element.style.zIndex = '99';
			this.datepicker.selectDate(DateFormat.parseFormat(this.element.value, this.options.currentFormat));
			this.datepicker.captureKeys();

			this.element.parentNode.appendChild(this.datepicker.element);
			Event.observe(document, 'click', this.hidePickerListener, true);
			this.pickerActive = true;
			Control.DatePicker.activePicker = this;
			this.pickerClicked();
		}
	}
};

Control.DatePicker.i18n = Class.create();
Object.extend(Control.DatePicker.i18n, {
	baseLocales: {
		'us': {
			dateTimeFormat: 'MM-dd-yyyy HH:mm',
			dateFormat: 'MM-dd-yyyy',
			firstWeekDay: 0,
			weekend: [0,6],
			timeFormat: 'HH:mm'
		},
		'eu': {
			dateTimeFormat: 'dd-MM-yyyy HH:mm',
			dateFormat: 'dd-MM-yyyy',
			firstWeekDay: 1,
			weekend: [0,6],
			timeFormat: 'HH:mm'
		},
		'iso8601': {
			dateTimeFormat: 'yyyy-MM-dd HH:mm',
			dateFormat: 'yyyy-MM-dd',
			firstWeekDay: 1,
			weekend: [0,6],
			timeFormat: 'HH:mm'
		}
	},
	createLocale: function(base, lang) {
		return Object.extend(Object.clone(Control.DatePicker.i18n.baseLocales[base]), {'language': lang});
	}
});
Control.DatePicker.i18n.prototype = {
	initialize: function(code) {
		var lang = code.charAt(2) == '_' ? code.substring(0,2) : code;
		var locale = (Control.DatePicker.Locale[code] || Control.DatePicker.Locale[lang]);
		this.opts = Object.clone(locale || {});
		var language = locale ? Control.DatePicker.Language[locale.language] : null;
		if (language) Object.extend(this.opts, language);
	},
	opts: null,
	inheritOptions: function(options) {
		if (!this.opts) this.setLocale('en_US');
		return Object.extend(this.opts, options || {});
	},
	tr: function(str) {
		return this.opts && this.opts.strings ? this.opts.strings[str] || str : str;
	}
};

Control.DatePicker.Locale = {};
with (Control.DatePicker) {
	// Full locale definitions not needed if countries use the language default format
	// Datepicker will fallback to the language default; i.e. 'es_AR' will use 'es'
	Locale['es'] = i18n.createLocale('eu', 'es');
	Locale['en'] = i18n.createLocale('us', 'en');
	Locale['en_GB'] = i18n.createLocale('eu', 'en');
	Locale['en_AU'] = Locale['en_GB'];
	Locale['de'] = i18n.createLocale('eu', 'de');
	Locale['es_iso8601'] = i18n.createLocale('iso8601', 'es');
	Locale['en_iso8601'] = i18n.createLocale('iso8601', 'en');
	Locale['de_iso8601'] = i18n.createLocale('iso8601', 'de');
}

Control.DatePicker.Language = {
	'es': {
		months: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Augosto', 'Septiembre', 'Octubre', 'Novimbre', 'Diciembre'],
		days: ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa'],
		strings: {
			'Now': 'Ahora',
			'Today': 'Hoy',
			'Time': 'Hora',
			'Exact minutes': 'Minuto exacto',
			'Select Date and Time': 'Selecciona Dia y Hora',
			'Select Time': 'Selecciona Hora',
			'Open calendar': 'Abre calendario'
		}
	},
	'de': { 
		months: ['Januar', 'Februar', 'MÃ¤rz', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'], 
		days: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'], 
		strings: { 
			'Now': 'Jetzt', 
			'Today': 'Heute', 
			'Time': 'Zeit', 
			'Exact minutes': 'Exakte minuten', 
			'Select Date and Time': 'Zeit und Datum AuswÃ¤hlen',
			'Select Time': 'Zeit AuswÃ¤hlen',
			'Open calendar': 'Kalender Ã¶ffnen'
		}
	}	
};

Control.DatePickerPanel = Class.create();
Object.extend(Control.DatePickerPanel.prototype, {
	initialize: function(options) {
		this.i18n = new Control.DatePicker.i18n(options && options.locale ? options.locale : 'en_US');
		options = this.i18n.inheritOptions(options);
		this.options = Object.extend({
						className: 'datepickerControl',
						closeOnToday: true,
						selectToday: true,
						showOnFocus: false,
						datePicker: true,
						timePicker: false,
						use24hrs: false,
						firstWeekDay: 0,
						weekend: [0,6],
						months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
						days: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']
					}, options || {});
		// Make sure first weekday is in the correct range
		with (this.options)
			if (isNaN(firstWeekDay*1)) firstWeekDay = 0;
			else firstWeekDay = firstWeekDay % 7;

		this.keysCaptured = false;
		this.calendarCont = null;
		this.currentDate = this.options.date ? this.options.date : new Date();
		this.dayOfWeek = 0;
		this.minInterval = 30;	// 5;

		this.selectedDay = null;
		this.selectedHour = null;
		this.selectedMinute = null;
		this.selectedAmPm = null;

		this.currentDays = [];
		this.hourCells = [];
		this.minuteCells = [];
		this.otherMinutes = null;
		this.amCell = null;
		this.pmCell = null;

		this.element = this.createPicker();
		this.selectDate(this.currentDate);
		
		
	},
	createPicker: function() {
		//alert(today.getHours());
		var elt = document.createElement('div');
		elt.style.position = 'absolute';
		elt.className = this.options.className;
		this.calendarCont = this.drawCalendar(elt, this.currentDate);

		Event.observe(elt, 'click', this.clickHandler.bindAsEventListener(this));
		Event.observe(elt, 'dblclick', this.dblClickHandler.bindAsEventListener(this));
		this.documentKeyListener = this.keyHandler.bindAsEventListener(this);
		if (this.options.captureKeys)
			this.captureKeys();
		
		return elt;
	},
	tr: function(str) {
		return this.i18n.tr(str);
	},
	captureKeys: function() {
		Event.observe(document, 'keydown', this.documentKeyListener, true);
		this.keysCaptured = true;
	},
	releaseKeys: function() {
		Event.stopObserving(document, 'keydown', this.documentKeyListener, true);
		this.keysCaptured = false;
	},
	setDate: function(date) {
		if (date) {
			// Clear container
			while (this.element.firstChild)
				this.element.removeChild(this.element.firstChild);
			this.calendarCont = this.drawCalendar(this.element, date);
		}
	},
	drawCalendar: function(container, date) {
		var calCont = container;
		if (!this.options.datePicker) {
			var calTable =  document.createElement('table');
			calTable.cellSpacing = 0;
			calTable.cellPadding = 0;
			calTable.border = 0;
		} else {
			var calTable = this.createCalendar(date);
		}

		var rowwidth = this.options.use24hrs ? 6 : 7;
		if (this.options.timePicker) {
			var timeTable;
			if (this.options.timePickerAdjacent && this.options.datePicker) {
				var rows = 0;

				var adjTable = document.createElement('table');
				adjTable.cellSpacing = 0;
				adjTable.cellPadding = 0;
				adjTable.border = 0;
				
				row = adjTable.insertRow(0);

				cell = row.insertCell(0);
				cell.vAlign = 'top';
				cell.appendChild(calTable);
				calCont = cell;

				cell = row.insertCell(1);
				cell.style.width = '5px';

				cell = row.insertCell(2);
				cell.vAlign = 'top';
				timeTable = document.createElement('table');
				timeTable.cellSpacing = 0;
				timeTable.cellPadding = 0;
				timeTable.border = 0;
				cell.appendChild(timeTable);

				container.appendChild(adjTable);

				row = timeTable.insertRow(rows++);
				row.className = 'monthLabel';
				cell = row.insertCell(0);
				cell.colSpan = rowwidth;
				cell.innerHTML = this.tr('Time');

				row = timeTable.insertRow(rows++);
				cell = row.insertCell(0);
				cell.colSpan = rowwidth;
				cell.style.height = '1px';

			} else {
				// SRS USING THIS ONE 
				container.appendChild(calTable);
				timeTable = calTable;
				var rows = calTable.rows.length;

				if (this.options.datePicker) {
					row = timeTable.insertRow(rows++);
					cell = row.insertCell(0);
					cell.colSpan = rowwidth;

					var hr = document.createElement('hr');
					Element.setStyle(hr, {'color': 'gray', 'backgroundColor': 'gray', 'height': '1px', 'border': '0', 'marginTop': '3px', 'marginBottom': '3px', 'padding': '0'});
					cell.appendChild(hr);
				}
			}
			
			// give an array for am & pm
			/*for (var i=0;i<hourCellsDisable.length;i++){
				if(hourCellsDisable[i] >= 12){
					hourCellsDisable2.push(hourCellsDisable[i]-12);
				}else{
					hourCellsDisable1.push(hourCellsDisable[i]);
				}
			}*/
			//activeDisable = hourCellsDisable1;
			
			var hourrows = 24;	// this.options.use24hrs ? 4 : 2;
			for (var j = 0; j < hourrows; ++j) {
				row = timeTable.insertRow(rows++);
				//for (var i = 0; i < 6; ++i){
				for (var i = 0; i < 2; ++i){
					var doDisable = false;
					cell = row.insertCell(i);
					//cell.className = 'hour';
					//cell.width = '14%';
					//cell.innerHTML = (j*6)+i+(this.options.use24hrs?0:1);
					var ih = j + ":" + (i==0?'00':'30') + "-" + (i==0?j:j+1) + ":"+(i==0?'30':'00')+'&nbsp;&nbsp;&nbsp;&nbsp;';
					var cb = "<input type=\"checkbox\" value=\""+ih+"\"/>";
					cell.innerHTML = cb + ih;
					//for(var x = 0; x < activeDisable.length; x++) {
					//	if(activeDisable[x] == cell.innerHTML) {
					//		doDisable = true;
					//	}
					//}
					//cell.id = 'cell'+cell.innerHTML;
					/* WOULD NEED TO SET FOR ONLY TODAY if(cell.innerHTML < this.currentDate.getHours()) {
						doDisable = true;
					}*/

					//if(!doDisable){
					//	cell.onclick = this.hourClickedListener((j*6)+i+(this.options.use24hrs?0:1));
					//} else {
					//	cell.className = 'dayothermonth';
					//}
				//	this.hourCells[(j*6)+i] = cell;
				}
				/*if (!this.options.use24hrs) {
					cell = row.insertCell(i);
					cell.className = 'ampm';
					cell.width = '14%';
					if (j) {
						cell.innerHTML = this.tr('PM');
						cell.onclick = this.pmClickedListener();
						this.pmCell = cell;
					} else {
						cell.innerHTML = this.tr('AM');
						cell.onclick = this.amClickedListener();
						this.amCell = cell;
					}
				}*/
			}

			row = timeTable.insertRow(rows++);
			cell = row.insertCell(0);
			cell.colSpan = 6;

			var hr = document.createElement('hr');
			Element.setStyle(hr, {'color': '#CCCCCC', 'backgroundColor': '#CCCCCC', 'height': '1px', 'border': '0', 'marginTop': '2px', 'marginBottom': '2px', 'padding': '0'});
			cell.appendChild(hr);
			cell = row.insertCell(1);

			/*for (var j = 0; j < (10/this.minInterval); ++j) {
				row = timeTable.insertRow(rows++);
				//for (var i = 0; i < 6; ++i){
				for (var i = 0; i < 2; ++i){
					cell = row.insertCell(i);
					cell.className = 'minute';
					cell.width = '14%';
					//var minval = ((j*6+i)*this.minInterval);
					var minval = ((j*2+i)*this.minInterval);
					if (minval < 10) minval = '0'+minval;
					cell.innerHTML = ':'+minval;
					cell.onclick = this.minuteClickedListener(minval);
					//this.minuteCells[(j*6)+i] = cell;
					this.minuteCells[(j*2)+i] = cell;
				}
				if (!this.options.use24hrs) {
					cell = row.insertCell(i);
					cell.width = '14%';
				}
			}*/


			row = timeTable.insertRow(rows++);
			cell = row.insertCell(0);
			cell.colSpan = rowwidth;

			hr = document.createElement('hr');
			Element.setStyle(hr, {'color': 'gray', 'backgroundColor': 'gray', 'height': '1px', 'border': '0', 'marginTop': '3px', 'marginBottom': '3px', 'padding': '0'});
			cell.appendChild(hr);

			row = timeTable.insertRow(rows++);
			cell = row.insertCell(0);
			cell.colSpan = rowwidth;

			selectButton = document.createElement('input');
			selectButton.type = 'button';
			if (this.options.datePicker)
				selectButton.value = this.tr('Select Date and Time');
			else
				selectButton.value = this.tr('Select to Continue');
				selectButton.onclick = function(e) {
					this.options.onSelect && this.options.onSelect(this.currentDate);
				}.bindAsEventListener(this);
				/*selectButton.onBlur = function(e) {
					this.options.onSelect && this.options.onSelect(this.currentDate);
				}.bindAsEventListener(this);*/
				cell.appendChild(selectButton);

		} else {
			calCont.appendChild(calTable);
		}
		//this.selectedAmPm=this.amCell;
		

		return calCont;

	},
	createCalendar: function(date) {
		this.currentDate = date;
		this.currentDays = [];

		var today = new Date();
		var previousYear = new Date(date.getFullYear() - 1, date.getMonth(), 1)
		var previousMonth = new Date(date.getFullYear(), date.getMonth() - 1, 1)
		var nextMonth = new Date(date.getFullYear(), date.getMonth() + 1, 1)
		var nextYear = new Date(date.getFullYear() + 1, date.getMonth(), 1)

		var row;
		var cell;
		var rows = 0;

		var calTable = document.createElement('table');
		calTable.cellSpacing = 0;
		calTable.cellPadding = 0;
		calTable.border = 0;

		row = calTable.insertRow(rows++);
		row.className = 'monthLabel';
		cell = row.insertCell(0);
		cell.colSpan = 7;
		cell.innerHTML = this.monthName(date.getMonth()) + ' ' + date.getFullYear();

		row = calTable.insertRow(rows++);
		row.className = 'navigation';

		cell = row.insertCell(0);
		cell.className = 'navbutton';
		cell.title = this.monthName(previousYear.getMonth()) + ' ' + previousYear.getFullYear();
		cell.onclick = this.movePreviousYearListener();
		cell.innerHTML = '&lt;&lt;';

		cell = row.insertCell(1);
		cell.className = 'navbutton';
		cell.title = this.monthName(previousMonth.getMonth()) + ' ' + previousMonth.getFullYear();
		cell.onclick = this.movePreviousMonthListener();
		cell.innerHTML = '&lt;';

		cell = row.insertCell(2);
		cell.colSpan = 3;
		cell.className = 'navbutton';
		cell.title = today.getDate() + ' ' + this.monthName(today.getMonth()) + ' ' + today.getFullYear();
		cell.onclick = this.dateClickedListener(today, true);
		if (this.options.timePicker)
			cell.innerHTML = this.tr('Now');
		else
			cell.innerHTML = this.tr('Today');

		cell = row.insertCell(3);
		cell.className = 'navbutton';
		cell.title = this.monthName(nextMonth.getMonth()) + ' ' + nextMonth.getFullYear();
		cell.onclick = this.moveNextMonthListener();
		cell.innerHTML = '&gt;';

		cell = row.insertCell(4);
		cell.className = 'navbutton';
		cell.title = this.monthName(nextYear.getMonth()) + ' ' + nextYear.getFullYear();
		cell.onclick = this.moveNextYearListener();
		cell.innerHTML = '&gt;&gt;';

		row = calTable.insertRow(rows++);
		row.className = 'dayLabel';
		for (var i = 0; i < 7; ++i){
			cell = row.insertCell(i);
			cell.width = '14%';
			cell.innerHTML = this.dayName((this.options.firstWeekDay + i) % 7);
		}
		
		row = null;
		var workDate = new Date(date.getFullYear(), date.getMonth(), 1);
		var day = workDate.getDay();
		var j = 0;

		// Pad with previous month
		if (day != this.options.firstWeekDay) {
			row = calTable.insertRow(rows++);
			row.className = 'calendarRow';
			workDate.setDate(workDate.getDate() - ((day - this.options.firstWeekDay + 7) % 7));
			day = workDate.getDay();
			while (workDate.getMonth() != date.getMonth()) {
				cell = row.insertCell(row.cells.length);
				this.assignDayClasses(cell, 'dayothermonth', workDate);
				cell.innerHTML = workDate.getDate();
				//cell.onclick = this.dateClickedListener(workDate);
				workDate.setDate(workDate.getDate() + 1);
				day = workDate.getDay();
			}
		}

		// Display days
		while (workDate.getMonth() == date.getMonth()) {
			if (day == this.options.firstWeekDay) {
				row = calTable.insertRow(rows++);
				row.className = 'calendarRow';
			}
			cell = row.insertCell(row.cells.length);
			
			this.assignDayClasses(cell, 'day', workDate);
			cell.innerHTML = workDate.getDate();
			if( (workDate.getMonth() == today.getMonth() && workDate.getYear() == today.getYear())  && (workDate.getDate() < today.getDate()) ) {
				this.assignDayClasses(cell, 'dayothermonth', workDate);
			} else if ((workDate.getMonth() < today.getMonth() && workDate.getYear() == today.getYear()) || (workDate.getYear() < today.getYear())){
				this.assignDayClasses(cell, 'dayothermonth', workDate);
			}else{
				cell.onclick = this.dateClickedListener(workDate);
			}
			this.currentDays[workDate.getDate()] = cell;
			workDate.setDate(workDate.getDate() + 1);
			day = workDate.getDay();
		}

		// Pad with next month
		if (day != this.options.firstWeekDay)
			do {
				cell = row.insertCell(row.cells.length);
				this.assignDayClasses(cell, 'dayothermonth', workDate);
				cell.innerHTML = workDate.getDate();
				var thisDate = new Date(workDate.getTime());
				cell.onclick = this.dateClickedListener(workDate);
				workDate.setDate(workDate.getDate() + 1);
				day = workDate.getDay();
			} while (workDate.getDay() != this.options.firstWeekDay);

		return calTable;
	},
	movePreviousMonthListener: function() {
		return function(e) {
				var prevMonth = new Date(
						this.currentDate.getFullYear(),
						this.currentDate.getMonth() - 1,
						this.currentDate.getDate(),
						this.currentDate.getHours(),
						this.currentDate.getMinutes());
				if (prevMonth.getMonth() != (this.currentDate.getMonth() + 11) % 12) prevMonth.setDate(0);
				this.selectDate(prevMonth);
			}.bindAsEventListener(this);
	},
	moveNextMonthListener: function() {
		return function(e) {
				var nextMonth = new Date(
						this.currentDate.getFullYear(),
						this.currentDate.getMonth() + 1,
						this.currentDate.getDate(),
						this.currentDate.getHours(),
						this.currentDate.getMinutes());
				if (nextMonth.getMonth() != (this.currentDate.getMonth() + 1) % 12) nextMonth.setDate(0);
				this.selectDate(nextMonth);
			}.bindAsEventListener(this);
	},
	moveNextYearListener: function() {
		return function(e) {
				var nextYear = new Date(
						this.currentDate.getFullYear() + 1,
						this.currentDate.getMonth(),
						this.currentDate.getDate(),
						this.currentDate.getHours(),
						this.currentDate.getMinutes());
				if (nextYear.getMonth() != this.currentDate.getMonth()) nextYear.setDate(0);
				this.selectDate(nextYear);
			}.bindAsEventListener(this);
	},
	movePreviousYearListener: function() {
		
		return function(e) {
				var prevYear = new Date(
						this.currentDate.getFullYear() - 1,
						this.currentDate.getMonth(),
						this.currentDate.getDate(),
						this.currentDate.getHours(),
						this.currentDate.getMinutes());
				if (prevYear.getMonth() != this.currentDate.getMonth()) prevYear.setDate(0);
				this.selectDate(prevYear);
			}.bindAsEventListener(this);
	},
	dateClickedListener: function(date, timeOverride) {
		var dateCopy = new Date(date.getTime());
		return function(e) {
				if (!timeOverride) {
					dateCopy.setHours(this.currentDate.getHours());
					dateCopy.setMinutes(this.currentDate.getMinutes());
				}
				this.dateClicked(dateCopy);
			}.bindAsEventListener(this);
	},
	hourClickedListener: function(hour) {
		return function(e) {
				this.hourClicked(hour);
			}.bindAsEventListener(this);
	},
	minuteClickedListener: function(minutes) {
		return function(e) {
				this.currentDate.setMinutes(minutes);
				this.dateClicked(this.currentDate);
			}.bindAsEventListener(this);
	},
	amClickedListener: function() {
		return function(e) {
				if (this.selectedAmPm == this.pmCell) {
					this.currentDate.setHours(this.currentDate.getHours()-12);
	
					Element.removeClassName(this.selectedAmPm, 'current');
					this.selectedAmPm = this.amCell;
					Element.addClassName(this.selectedAmPm, 'current');
			
					//this.dateClicked(this.currentDate);
					
					activeDisable = hourCellsDisable1;
					this.refreshCalendar();
					//createTimePickers();
				}
			}.bindAsEventListener(this);
	},
	pmClickedListener: function() {
		return function(e) {
				if (this.selectedAmPm == this.amCell) {
					this.currentDate.setHours(this.currentDate.getHours()+12);
					
					Element.removeClassName(this.selectedAmPm, 'current');
					this.selectedAmPm = this.pmCell;
					Element.addClassName(this.selectedAmPm, 'current');

					//this.dateClicked(this.currentDate);
					
					activeDisable = hourCellsDisable2;
					this.refreshCalendar();
					//createTimePickers();

					
				}
			}.bindAsEventListener(this);
	},
	
	refreshCalendar: function(){
		for (var i = 1; i <= 12; ++i){
			var doDisable = false;
			cellid = 'cell'+i;
			cell = this.hourCells[i-1];

			for(var x = 0; x < activeDisable.length; x++) {
				if(activeDisable[x] == i) {
					doDisable = true;
				}
			}
			
			if(doDisable){
				Element.removeClassName(cellid, 'hour');
				Element.addClassName(cellid, 'dayothermonth');
				cell.onclick = null;
			} else {
				cell.onclick = this.hourClickedListener(i);
				Element.removeClassName(cellid, 'dayothermonth');
				Element.addClassName(cellid, 'hour');
			}
			
		}

	},
	
	
	assignDayClasses: function(cell, baseClass, date) {
		var today = new Date();
		Element.addClassName(cell, baseClass);
		if (date.getFullYear() == today.getFullYear() && date.getMonth() == today.getMonth() && date.getDate() == today.getDate())
			Element.addClassName(cell, 'today');
		if (this.options.weekend.include(date.getDay()))
			Element.addClassName(cell, 'weekend');
	},
	monthName: function(month) {
		return this.options.months[month];
	},
	dayName: function(day) {
		return this.options.days[day];
	},
	dblClickHandler: function(e) {
		if(this.options.onSelect)
			this.options.onSelect(this.currentDate);
		Event.stop(e);
	},
	clickHandler: function(e) {
		if(this.options.onClick)
			this.options.onClick();
		Event.stop(e);
	},
	hoverHandler: function(e) {
		if(this.options.onHover)
			this.options.onHover(date);
	},
	keyHandler: function(e) {
		var days = 0;
		switch (e.keyCode){
			case Event.KEY_RETURN:
			if (this.options.datePicker) {
				if (this.options.onSelect) this.options.onSelect(this.currentDate);
			}
				break;
			case Event.KEY_LEFT:
				//days = -1;
				break;
			case Event.KEY_UP:
				//days = -7;
				break;
			case Event.KEY_RIGHT:
				//days = 1;
				break;
			case Event.KEY_DOWN:
				//days = 7;
				break;
			case 33: // PgUp
				//var lastMonth = new Date(this.currentDate.getFullYear(), this.currentDate.getMonth() - 1, this.currentDate.getDate());
				//days = -this.getDaysOfMonth(lastMonth);
				break;
			case 34: // PgDn
				days = this.getDaysOfMonth(this.currentDate);
				break;
			case 13: // enter-key (forms without submit buttons)
				this.dateClicked(this.currentDate);
				break;
			default:
				return;
		}
		if (days != 0) {
			var moveDate = new Date(this.currentDate.getFullYear(), this.currentDate.getMonth(), this.currentDate.getDate() + days);
			moveDate.setHours(this.currentDate.getHours());
			moveDate.setMinutes(this.currentDate.getMinutes());
			this.selectDate(moveDate);
		}
		Event.stop(e);
		return false;
	},
	getDaysOfMonth: function(date) {
		var lastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0);
		return lastDay.getDate();
	},
	getNextMonth: function(month, year, increment) {
		if (p_Month == 11) return [0, year + 1];
		else return [month + 1, year];
	},
	getPrevMonth: function(month, year, increment) {
		if (p_Month == 0) return [11, year - 1];
		else return [month - 1, year];
	},
	dateClicked: function(date) {
		if (date) {
			if (!this.options.timePicker && this.options.onSelect)
				this.options.onSelect(date);
			this.selectDate(date);
		}
	},
	dateChanged: function(date) {
		if (date) {
			if ((!this.options.timePicker || !this.options.datePicker) && this.options.onHover)
				this.options.onHover(date);
			this.selectDate(date);
		}
	},
	hourClicked: function(hour) {
		if (!this.options.use24hrs) {
			if (hour == 12) {
				if (this.selectedAmPm == this.amCell)
					hour = 0;
					//hour = 12;
			} else if (this.selectedAmPm == this.pmCell) {
				hour += 12;
			}
		}
		this.currentDate.setHours(hour,00);
		this.dateClicked(this.currentDate);
	},
	selectDate: function(date) {
		//getBookingTimes();
		if (date) {
			if (this.options.datePicker) {
				if (date.getMonth() != this.currentDate.getMonth()
					|| date.getFullYear() != this.currentDate.getFullYear())
					this.setDate(date);
				else
					this.currentDate = date;
				
				if (date.getDate() < this.currentDays.length) {
					if (this.selectedDay)
						Element.removeClassName(this.selectedDay, 'current');
					this.selectedDay = this.currentDays[date.getDate()];
					Element.addClassName(this.selectedDay, 'current');
				}
			}

			if (this.options.timePicker) {
				var hours = date.getHours();
				if (this.selectedHour)
					Element.removeClassName(this.selectedHour, 'current');
				if (this.options.use24hrs)
					this.selectedHour = this.hourCells[hours];
				else
					this.selectedHour = this.hourCells[hours % 12 ? (hours % 12) - 1 : 11];
				Element.addClassName(this.selectedHour, 'current');

				if (this.selectedAmPm){
					Element.removeClassName(this.selectedAmPm, 'current');
					//hourCellsDisable==hourCellsDisable2?this.selectedAmPm=this.pmCell:this.selectedAmPm=this.amCell;
				//this.selectedAmPm = (hours < 12 ? this.amCell : this.pmCell);
				//this.selectedAmPm = (this.selectedAmPm==this.pmCell ? this.amCell : this.pmCell);
					Element.addClassName(this.selectedAmPm, 'current');
				}

				var minutes = date.getMinutes();
				if (this.selectedMinute)
					Element.removeClassName(this.selectedMinute, 'current');
				//Element.removeClassName(this.otherMinutes, 'current');
				if (minutes % this.minInterval == 0) {
					//this.otherMinutes.value = '';
					this.selectedMinute = this.minuteCells[minutes / this.minInterval];
					Element.addClassName(this.selectedMinute, 'current');
				} else {
					//this.otherMinutes.value = minutes;
					//Element.addClassName(this.otherMinutes, 'current');
				}
			}

			if (this.options.onHover)
				this.options.onHover(date);
		}
	}
	

});


