// JScript source code

var rectangle = new Class({
	initialize: function() {
		this.left	= 0;
		this.top	= 0;
		this.width	= 0;
		this.height = 0;
	},
	fromElement: function(el) {
		if(el.getCoordinates) {
			var coo		= el.getCoordinates();
			this.left	= coo.left;
			this.top	= coo.top;
			this.width	= coo.width;
			this.height = coo.height;
		} else if(el.getPosition && el.getSize) {
			var pos		= el.getPosition();
			var sz		= el.getSize();
			this.left	= pos.x;
			this.top	= pos.y;
			this.width	= sz.scrollSize.x;
			this.height = sz.scrollSize.y;
		}
	}
});



var fieldChecker = {
	test:function(field) {
		var bResult = false;
		if(field.hasClass('email')) {
			return this.checkEmail(field);
		}
		
		bResult = bResult | this.checkField(field);
		return bResult;
	},
	checkEmail:function(field) {
		var reg = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
		if(field.value.match(reg))
			return true;
		return false;
	},
	checkField:function(field) {
		return field.value !== '';
	}
};

function checkForm(fid) {
	var form		= $(fid);
	var required	= $ES('.required', form);
	var result = {};
	result.invalid = new Array();
	if(required) {
		required.each(function(req, index) {
			var tr = req;
			while(tr = tr.getParent()) {
			  if(tr.getTag() === 'tr')
				break;
			}
			
			if(tr) {
				tr.removeClass('invalidrow');
				var ifm = tr.getElement('.infomarker');
				if(ifm) {
					ifm.innerHTML ='';
				}
			}
			req.removeClass('invalid');
			if(!fieldChecker.test(req)) {
				req.addClass('invalid');
				if(tr) {
					tr.addClass('invalidrow');
					if(ifm) {
						ifm.innerHTML ='Bitte unbedingt angeben !';
					}
				}
				this.invalid[this.invalid.length] = req;
			}
		}.bind(result));
	}
	if(result.invalid.length >0)
		return false;
	form.nextinc.value = parseInt(form.nextinc.value) + 1;
	return true;
}

var expandors = new Class({
	initialize: function(option) {
		this.tt = new Element('div', {'styles':{'position':'absolute', 'left':0, 'top':0, 'z-index':10}, 'class':'markerdiv'});
		this.terminelist = new Array();
		this.minselect = $pick(option.minselect, 3);
		this.maxselect = $pick(option.maxselect, 7);
		$each(rows, function(item, timestamp) {
			var table = $(timestamp);
			if(table) {
				table.data		= item;
				table.handler	= this;
				item.each(function(data, index) {
					if(data.ispast === false) {
						var cell	= new Element(this.rows[0].cells[index]);
						var fc		= cell.getElement('.expandable_termincell');
						if(fc) {
							fc.addEvent('click', this.handler.reserveCell.bindWithEvent(this.handler));
							fc.addEvent('mouseenter', this.handler.hoverButton.bindWithEvent(this.handler));
							fc.addEvent('mouseleave', this.handler.unhoverButton.bindWithEvent(this.handler));
							fc.data = data;
							if(fc.data.prereserved == true) {
								this.handler.checkList(fc);
							}
						}
					}
				}.bind(table));
			}
			table.addEvent('mouseleave', this.leftTable.bindWithEvent(this));
		}.bind(this));
		this.formcontainer = $('formcontainer');
		this.form = $('reserveForm');
		if(this.form && this.formcontainer) {
			this.shadow = new Element('div', {'styles':{'position':'absolute', 'left':0, 'top':0, 'z-index':'10', 'visibility':'hidden', 'background-color':'#000022'}});
			this.shadow.addEvent('click', this.hideForm.bindWithEvent(this));
			new Element(this.form.reset).addEvent('click', this.hideForm.bindWithEvent(this));
			this.formcontainer.setStyle('z-index', '20');
			
			
		}
		if(option.messagecontainer) {
			this.showMessage($(option.messagecontainer));
		}
		
		var send = $$('.send');
		if(send) {
			send.each( function (item, index) {
				item.addEvent('click', this.showSendForm.bindWithEvent(this));
			}, this);
		}
		
		this.checkList();
	},
	hoverButton: function(ev) {
		var div = ev.target;
		if(div.data.ispast) 
			return;
		
		var append = '';
		if(div.data.isreserved) {
			this.settt(div, 'Dieser Termin kann leider nicht reserviert werden', 0.5);	
		} else {
			if(div.data.prereserved === true) {
				this.settt(div, 'Klicken entfernt den Termin aus der Reservierungsliste', 0.8);
			} else {
				if(this.terminelist.length >= this.maxselect)
					this.settt(div, 'Sie haben bereits ' + this.maxselect + ' Termine in Ihrer Reservierungsliste', 0.8);
				else
					this.settt(div, 'Klicken f&uuml;gt den Termin Ihrer Reservierungsliste hinzu', 0.8);
			}
		}
	},
	unhoverButton: function(ev) {
		var div = ev.target;
		if(div.data.ispast) 
			return;
	},
	hitTable: function(ev) {
		var div = ev.target;
		if(div.data.ispast) 
			return;
		if(!this.tt.getParent()) {
			this.tt.inject(document.body);
		}
		this.tt.innerHTML = '<b>Termin : </b><br/>' + div.data.day + '<br/>' + div.data.start;
		var coos = div.getCoordinates();
		this.tt.setStyle('left', coos.left + 'px');
		this.tt.setStyle('top', coos.bottom + 'px');
		if(div.data.isreserved === true) {
			this.tt.innerHTML += '<br/>Leider reserviert';
			this.tt.setOpacity(0.5);
		} else {
			this.tt.innerHTML += '<br/>Zum reservieren : bitte klicken!';
			this.tt.setOpacity(1.0);
			div.addClass('buttonhover');
		}
		
	},
	leftButton: function(ev) {
		ev.target.removeClass('buttonhover');
	},
	leftTable: function(ev) {
		if(this.tt && this.tt.getParent()) {
			this.tt.remove();
		}
	},
	reserveCell: function(ev) {
		var div = ev.target;
		if(div.data.isreserved)
			return;
			
		if(div) {
			if(div.data.prereserved) {
				div.removeClass('reserved');
				div.data.prereserved = false;
				this.settt(div, 'Klicken f&uuml;gt den Termin Ihrer Reservierungsliste hinzu', 0.8);
			} else {
				if(this.terminelist.length >= this.maxselect)
					return;
				div.data.prereserved = true;
				div.addClass('reserved');
				this.settt(div, 'Klicken entfernt den Termin aus der Reservierungsliste', 0.8);
			}
			this.checkList(div);
		}
	},
	settt: function(div, append, opacity) {
		if(!this.tt.getParent()) {
			this.tt.inject(document.body);
		}
		this.tt.innerHTML = '<b>Termin : </b><br/>' + div.data.day + '<br/>' + div.data.start + ' Uhr';
		var coos = div.getCoordinates();
		this.tt.setStyle('left', coos.left + 'px');
		this.tt.setStyle('top', coos.bottom + 'px');
		this.tt.innerHTML += '<br/>' + append;
		this.tt.setOpacity(opacity);
	},
	checkList: function(thediv) {
		if(!thediv)
			return;
		if(thediv.data.prereserved) {
			this.terminelist.include(thediv);
		} else {
			this.terminelist.remove(thediv);
		}
		var footers = $$('.footertext');
		if(footers) {
			footers.each(function (footer, index) {
				footer.innerHTML= 'Sie haben bisher ' + this.terminelist.length + ' Termine vorgemerkt';
			}, this);
		}
		if(this.terminelist.length >= this.minselect) {
			this.enableSend();
		} else {
			this.disableSend();
		}
	},
	disableSend: function(){
		var sends = $$('.send');
		if(sends) {
			sends.each( function ( send, index) { 
				send.disabled = true;
			});
		}
	},
	enableSend: function() {
		var sends = $$('.send');
		if(sends) {
			sends.each( function ( send, index) { 
				send.disabled = false;
			});
		}
	},
	insertHidden: function(form, name, value) {
		var ip = new Element('input', {'type':'hidden', 'value':value, 'name':name});
		ip.inject(form);
	},
	removeHiddens: function(form, name) {
		var ips = form.getElements('input');
		if(ips) {
			ips.each( function (ip, index) {
				if(ip.name == this.name) {
					ip.remove();
				}
			}, {'root':this, 'remname':name});
		}
	},
	showSendForm: function(ev) { 
		if(!this.terminelist || this.terminelist.length < this.minselect)
			return;
			
		if(this.shadow && !this.shadow.getParent()) {
			var coos = $('content').getCoordinates();
			this.shadow.setStyle('width', window.getWidth() + 'px');
			this.shadow.setStyle('height', coos.bottom + 'px');
			this.shadow.injectAfter(this.formcontainer);
			this.shadow.effect('opacity').start(0.0, 0.6);
			$('thedate').innerHTML = '';
			this.removeHiddens(this.form, 'day[]');
			this.removeHiddens(this.form, 'start[]');
			this.removeHiddens(this.form, 'end[]');
			if(this.form && this.formcontainer) {
				if($('thedate')) {
					this.terminelist.each(function(div, index) {
						$('thedate').innerHTML  += '<b>Termin : </b> &nbsp;' + div.data.day + '&nbsp;' + div.data.start + ' Uhr' + '<br/>';
						this.insertHidden(this.form, 'day[]', div.data.day); 
						this.insertHidden(this.form, 'start[]', div.data.start);
						this.insertHidden(this.form, 'end[]', div.data.end);	
					}, this);
				}
				this.shadow.attached = this.formcontainer;
				this.formcontainer.effect('opacity').start(0.0, 1.0);
				this.centerDiv(this.formcontainer);
			}
		}
		
	},
	showForm: function(ev) { 
		var div = ev.target;
		if(div.data.isreserved)
			return;
		this.leftTable(ev);
		if(this.shadow && !this.shadow.getParent()) {
			var coos = $('content').getCoordinates();
			this.shadow.setStyle('width', window.getWidth() + 'px');
			this.shadow.setStyle('height', coos.bottom + 'px');
			this.shadow.injectAfter(this.formcontainer);
			this.shadow.effect('opacity').start(0.0, 0.6);
			if(this.form && this.formcontainer) {
				if($('thedate')) {
					$('thedate').innerHTML = '<b>Termin : </b><br/>' + div.data.day + '<br/>' + div.data.start;
					this.form.day.value		= div.data.day;
					this.form.start.value		= div.data.start;
					this.form.end.value		= div.data.end;
				}
				this.shadow.attached = this.formcontainer;
				this.formcontainer.effect('opacity').start(0.0, 1.0);
				this.centerDiv(this.formcontainer);
			}
		}
		
	},
	showMessage: function(container) { 
		
		if(!container || container.getText() == '')
			return;
		container.setStyle('z-index', 20);
		if(this.shadow && !this.shadow.getParent()) {
			var coos = $('content').getCoordinates();
			this.shadow.setStyle('width', window.getWidth() + 'px');
			this.shadow.setStyle('height', coos.bottom + 'px');
			this.shadow.injectAfter(this.formcontainer);
			this.shadow.effect('opacity').start(0.0, 0.6);
			this.shadow.attached = container;
			container.effect('opacity').start(0.0, 1.0);
			var ctrl = $E('input', container);
			if(ctrl)
				ctrl.addEvent('click', this.hideForm.bindWithEvent(this));
		}
		this.centerDiv(container);
	},
	hideForm: function(ev) {
		if(this.shadow && this.shadow.getParent()) {
			this.shadow.effect('opacity', {'onComplete':function(){this.shadow.remove()}.bind(this)}).start(0.6, 0.0);
			if(this.shadow.attached) {
				this.shadow.attached.effect('opacity').start(1.0, 0.0);
			}
		}
	},
	centerDiv: function(div) {
		
		var pos		= window.getPosition();
		var sz		= window.getSize();
		
		var rectFrm = new rectangle();
		rectFrm.fromElement(div);
		
		var left	= sz.scroll.x + (sz.size.x - rectFrm.width) / 2;
		var top		= sz.scroll.y + (sz.size.y - rectFrm.height) / 2;
		div.setStyles({'left':left + 'px', 'top': top + 'px'}); 
	}
});

