var highlightAvailability = function ( items, availability ) {
	for(var i=0; i<items.length; i++) {
		items[i].addClass(isAvailable(items[i].date, availability) ?'available' :'unavailable');
	}
}

var isAvailable = function ( date, availability ) {
	for(var i=0; i<availability.length; i++) {
		if(date.diff(availability[i][0])<=0 && date.diff(availability[i][1])>=0) {
			return true;
		}
	}
	return false;
}

var addGooglemaps = function ( canvas, lat, lng, bezeichnung, ort ) {
	if(!(parseInt(lat) && parseInt(lng))) {
		canvas.dispose();
		return;
	}
	var location = new google.maps.LatLng(lat, lng);
	var map = new google.maps.Map(canvas, {
		zoom: 11,
		center: location,
		mapTypeId: google.maps.MapTypeId.ROADMAP,
		scrollwheel: false
	});
	var marker = new google.maps.Marker({
		position: location,
		map: map,
		title: bezeichnung + ' in ' + ort
	});
	var infowindow = new google.maps.InfoWindow({
		content: new Element('div').adopt(
			new Element('p').adopt(
				new Element('strong', {text:bezeichnung}),
				new Element('br')
			).appendText('in ' + ort),
			new Element('p').adopt(
				new Element('a', {
					href: 'http://maps.google.com/?z=11&mrsp=1&daddr='+location.lat()+','+location.lng(), 
					text: 'Route berechnen',
					target: '_blank',
					styles: {color:'#0000ff'}})
			)
		)
	});
	infowindow.open(map, marker);
	google.maps.event.addListener(marker, 'click', function(){
		infowindow.open(map, marker);
	});
}

var loadAvailability = function ( url ) {
	var req = new Request({
		method: 'get',
		url: url, 
		onSuccess: function(responseText, responseXML){
			var availability = new Hash();
			var rooms_nodes = responseXML.getElementsByTagName('room');
			for(var i=0; i<rooms_nodes.length; i++) {
				var room = rooms_nodes[i];
				if(room.getElementsByTagName('availability')[0].getAttribute('blocked').toLowerCase()=='y') {
					window.fireEvent('loadedAvailability', availability);
					return;
				}
				var a = new Array();
				var available_nodes = room.getElementsByTagName('available');
				for(var j=0; j<available_nodes.length; j++) {
					var available = available_nodes[j];
					a.push([
						new Date().parse(available.getAttribute('arrival')),
						new Date().parse(available.getAttribute('departure')),
					]);
				};
				availability.set(room.getAttribute('id'), a);
			}
			window.fireEvent('loadedAvailability', availability);
		}
	}).send();
}

var card_summary_minisearch_render_func = function(){
	this.dom.form = this.dom.el.getElement('form');
	this.date_from = new NetronautUI_Widgets_InputDate(this.dom.form.getElement('[name=date_from]'));
	this.date_to = new NetronautUI_Widgets_InputDate(this.dom.form.getElement('[name=date_to]'));
	this.dom.el.getElement('.option-guests').empty().adopt(
		this.dom.guests = new Element('div'),
		new Element('div').adopt(
			new Element('a', {'class':'light', href:'javascript:void(0);', text:'Suche anpassen'})
				.addEvent('click', function(event){this.fireEvent('guestDetailSelected', event)}.bind(this))
		)
	);
}

window.addEvent('loadedAvailability', function(availability) {
	availability.each(function(item, room_id){
		if(!(item.length>1)) return;
		var canvas = $('calendar_'+room_id);
		if(!canvas) return;
		canvas.availability = item;
		var cal = new NetronautUI_Widgets_Calendar(canvas.empty(), {
			markCurrent: false,
			limit:{
				from: new Date(),
				to: canvas.availability.getLast()[1]
			}
		}).viewMonth(new Date());
		highlightAvailability(cal.getMonthItems(), canvas.availability);
		cal.addEvent('changeMonth', function(){
			highlightAvailability(cal.getMonthItems(), canvas.availability);
		});
		canvas.calendar = cal;
	});
	$$('[id^=calendar_]').each(function(item){
		if(!item.availability) {
			$(item.parentNode).destroy();
		} else {
			item.calendar.addEvent('select', function(date, event){
				
				// update the date cookie & calendar
				var search_data = new Minisearch_Data('search-data')
				diff = Math.abs(new Date(search_data.options.dates.departure).diff(
						new Date(search_data.options.dates.arrival)));
				search_data.options.dates.arrival = date.getTime();
				search_data.options.dates.departure = date.clone().increment('day', diff).getTime();
				search_data.write();
				
				// open floating calendar window
				var option_pos = document.form_win.options.positionOnTarget;
				document.form_win.options.positionOnTarget = {edge:'bottomRight', position:'centerLeft'};
				document.form_win.open(event);
				document.form_win.form.date_from.dom.el.focus();
				document.form_win.options.positionOnTarget = option_pos;
			});
		}
	});
});

window.addEvent('domready', function(){
	
	// add google maps
	var o = document.card_summary_maps_options;
	addGooglemaps(
		$('map_canvas'), o[0], o[1], o[2], o[3]
	);

	// prepare availability
	$$('[id^=calendar_]').each(function(item){
		item.adopt(new Element('img', {src:'/default/images/ajax-loader/d9d9d9.gif'}).setStyle('margin', '6em'));
	});
	loadAvailability(document.card_summary_availability_url);

	// init minisearch in units
	var search_data = new Minisearch_Data('search-data');
	var form = new Minisearch_Form($('card-minisearch-availability'), {
		data: search_data, 
		render: card_summary_minisearch_render_func
	});
	var win = new NetronautUI_Window(form, {positionOnTarget:true, autoClose:true, addOverlay:true, overlayOpacity:0.4});
	win.dom.hitarea.extend(form.dom.hitarea);
	form.optionsDialogue.increaseZIndex();
	win.setSize({x:220});
	win.form = form;
	win.addEvent('beforeOpen', function(){
		this.form.update();
	}).addEvent('close', function(){
		document.form.update();
	});
	win.form.dom.form.addEvent('submit', function(){
		this.close();
	}.bind(win));
	new NetronautUI_WindowDecorator(win, {'closeButton':{events:{'click':win.close.bind(win)}, 'offset':{x:-8, y:6}}});
	document.form_win = win;
	
	// add tooltip to ratings
	var myTips = new Tips(null, {className:'rating-tooltip rating'});
	if(null != (el = $('card-info-rating'))) {
	    el.store('tip:title', $('rating-tooltip-title'));
	    el.store('tip:text', $('rating-tooltip-text'));
	    myTips.attach($('card-info-rating'))
	}
});

