function initCalendarItems() {
	calendarItems = $$('div#calendar_overview ul li');
	if (calendarItems) {
		calendarItems.each(function(item, index) {
			item.isMonth        = item.hasClass('month');
			item.isForKids      = item.hasClass('kids');
			item.isForYouth     = item.hasClass('youth');
			item.isForAdults    = item.hasClass('adults');
			item.isForEverybody = (item.hasClass('kids') || item.hasClass('youth') || item.hasClass('adults'));

			// initialize slide effect, show all items
			item.itemSlider = new Fx.Slide(item, {duration: 200});
			item.itemSlider.show();
		});
	}

	// IE fix to set radio button checked
	if (window.ie) $('filter_everybody').setProperty('checked', true);

	// initial filtering
	filterCalendarItems();
}

function filterCalendarItems() {

	var maxCalendarItems = 12;

	// get input
	var showAllItems          = $('btn_show_all') ? $('btn_show_all').showAllItems : false;
	var showItemsForKids      = $('filter_kids').checked;
	var showItemsForYouth     = $('filter_youth').checked;
	var showItemsForAdults    = $('filter_adults').checked;
	var showItemsForEverybody = $('filter_everybody').checked;

	// determine which items should be shown
	calendarItems.each(function(item, index) {
		item.shouldBeShown = false;
		if (!item.isMonth) {
			// check if item should be shown
			if (!item.shouldBeShown && (showItemsForKids && item.isForKids)) {
				item.shouldBeShown = true;
			}
			if (!item.shouldBeShown && (showItemsForYouth && item.isForYouth)) {
				item.shouldBeShown = true;
			}
			if (!item.shouldBeShown && (showItemsForAdults && item.isForAdults)) {
				item.shouldBeShown = true;
			}
			if (!item.shouldBeShown && (showItemsForEverybody && item.isForEverybody)) {
				item.shouldBeShown = true;
			}
		}
	});

	// show all items, or a selection?
	if (!showAllItems) {
		var countShouldBeShownItems = 0;
		calendarItems.each(function(item, index) {
			if (!item.isMonth) {
				if (item.shouldBeShown) {
					if (countShouldBeShownItems >= maxCalendarItems) {
						item.shouldBeShown = false;
					} else {
						countShouldBeShownItems++;
					}
				}
			}
		});
	}

	// determine which months should be shown
	calendarItems.each(function(item, index) {
		if (item.isMonth) {
			currentMonthItem = item;
		} else {
			if (item.shouldBeShown) {
				currentMonthItem.shouldBeShown = true;
			}
		}
	});

	// animate items
	calendarItems.each(function(item, index) {
		if (item.shouldBeShown) {
			item.itemSlider.slideIn();
		} else {
			item.itemSlider.slideOut();
		}
	});
}

function replaceButton(form) {

	var originalButtons = form.getElements('input.button');

	originalButtons.each(function(originalButton, index) {
		var newButton = new Element('p', { 'class': 'button_replaced' });
		newButton.set('html', originalButton.getProperty('value'));
		newButton.replaces(originalButton);
		newButton.addEvent('click',  function() { form.submit(); });
	});
}

function toggleRoute(button, route, info) {
	button.toggleClass('active');
	info.toggleClass('info_active');
	route.toggleClass('route_active');
	route.itemSlider.toggle();
}

function setSliderRoutes(info, route) {
	// set event on target element
	route.itemSlider = new Fx.Slide(route, {duration: 500});
	route.itemSlider.hide();

	// add link to toggle route
	var toggle_route = new Element('p', { 'class': 'toggle_route' });
	toggle_route.set('html', 'Routebeschrijving');
	toggle_route.injectInside(info);
	toggle_route.addEvent('click',  function() { toggleRoute(this, route, info); });
}

window.addEvent('domready', function() {

	var body                   = $(document.body);
	var isCalendarOverview     = $('calendar_overview');
	var titleCalendarOverview  = $('title_calendar_overview');
	var cnrShowAll             = $('cnr_show_all');

	var backgroundImages       = 5;

	$$(document.body).addClass('random_background_' + Math.floor(Math.random() * backgroundImages + 1));

	// create filter options for calendar overview
	if (isCalendarOverview && titleCalendarOverview) {

		var cnrSelectionForm   = new Element('div',   { 'id': 'cnr_selection_form', 'class': 'clear' });
		var textSelectionForm  = new Element('p',     null);

		var labelYouth         = new Element('label', { 'for': 'filter_youth'     });
		var labelKids          = new Element('label', { 'for': 'filter_kids'      });
		var labelAdults        = new Element('label', { 'for': 'filter_adults'    });
		var labelEverybody     = new Element('label', { 'for': 'filter_everybody' });

		var inputYouth         = new Element('input', { 'type': 'radio', 'name': 'filter', 'id': 'filter_youth',     'value': 'youth'  });
		var inputKids          = new Element('input', { 'type': 'radio', 'name': 'filter', 'id': 'filter_kids',      'value': 'kids'   });
		var inputAdults        = new Element('input', { 'type': 'radio', 'name': 'filter', 'id': 'filter_adults',    'value': 'adults' });
		var inputEverybody     = new Element('input', { 'type': 'radio', 'name': 'filter', 'id': 'filter_everybody', 'value': 'everybody', 'checked': 'checked' });

		textSelectionForm.set('html', 'Toon activiteiten voor:');
		labelYouth.set('html', 'Jongeren');
		labelKids.set('html', 'Kinderen');
		labelAdults.set('html', 'Volwassenen');
		labelEverybody.set('html', 'Iedereen');

		inputYouth.addEvent('click',     filterCalendarItems);
		inputKids.addEvent('click',      filterCalendarItems);
		inputAdults.addEvent('click',    filterCalendarItems);
		inputEverybody.addEvent('click', filterCalendarItems);

		textSelectionForm.injectInside(cnrSelectionForm);

		inputKids.injectInside(cnrSelectionForm);
		labelKids.injectInside(cnrSelectionForm);

		inputAdults.injectInside(cnrSelectionForm);
		labelAdults.injectInside(cnrSelectionForm);

		inputYouth.injectInside(cnrSelectionForm);
		labelYouth.injectInside(cnrSelectionForm);

		inputEverybody.injectInside(cnrSelectionForm);
		labelEverybody.injectInside(cnrSelectionForm);

		if (cnrSelectionForm.injectAfter(titleCalendarOverview)) {

			var countCalendarItems = $$('div#calendar_overview ul li').length - $$('div#calendar_overview ul li.month').length;

			if (cnrShowAll && countCalendarItems > 12) { // TODO: make global var max calendar items
				var cnrSelectionFormButton = new Element('p', { 'id': 'btn_show_all', 'class': 'button' });

				cnrSelectionFormButton.set('html', 'Meer agenda items');
				cnrSelectionFormButton.injectInside(cnrShowAll);

				cnrSelectionFormButton.addEvents({
					'click' : function() {
						this.showAllItems = !this.showAllItems;
						this.set('html', (this.showAllItems ? 'Minder' : 'Meer') + ' agenda items');
						filterCalendarItems();
					},
					'mouseenter': function(){ this.toggleClass('hover'); },
					'mouseleave': function(){ this.toggleClass('hover'); }
				});
			}

			initCalendarItems();
		}
	}

	// replace form buttons
	var formSearchMain  = $('form_search_main');
	var formSearch      = $('form_search');

	if (formSearchMain) replaceButton(formSearchMain);
	if (formSearch)     replaceButton(formSearch);

	// slide location routes
	var paper_dome_info  = $('cnr_ctt_main').getElement('div.paper_dome_info');
	var paper_dome_route = $('cnr_ctt_main').getElement('div.paper_dome_route');
	if (paper_dome_info && paper_dome_route) setSliderRoutes(paper_dome_info, paper_dome_route);

	var forum_t_zand_info  = $('cnr_ctt_main').getElement('div.forum_t_zand_info');
	var forum_t_zand_route = $('cnr_ctt_main').getElement('div.forum_t_zand_route');
	if (forum_t_zand_info && forum_t_zand_route) setSliderRoutes(forum_t_zand_info, forum_t_zand_route);

	var forum_weide_wereld_info  = $('cnr_ctt_main').getElement('div.forum_weide_wereld_info');
	var forum_weide_wereld_route = $('cnr_ctt_main').getElement('div.forum_weide_wereld_route');
	if (forum_weide_wereld_info && forum_weide_wereld_route) setSliderRoutes(forum_weide_wereld_info, forum_weide_wereld_route);

	// add addThis button to calendar items
	var calendarExtraInfo = body.getElement('div.calendar_extra_info');

	if (calendarExtraInfo) {
		
		var addThisHTML = '<a href="http://www.addthis.com/bookmark.php?v=250&amp;username=cultuur19" class="addthis_button_compact">Share</a>' +
			'<span class="addthis_separator">|</span>' +
			'<a class="addthis_button_facebook"></a>' +
			'<a class="addthis_button_myspace"></a>' +
			'<a class="addthis_button_google"></a>' +
			'<a class="addthis_button_twitter"></a>';

		var newAddThisButton = new Element('div', {
			'class': 'addthis_toolbox addthis_default_style',
			'html': addThisHTML
		});

		newAddThisButton.inject(calendarExtraInfo);

		// load external js
		var addThisScript = new Asset.javascript('http://s7.addthis.com/js/250/addthis_widget.js#username=cultuur19', {});
	}

	// open links to downloadable files or other sites in a new window
	Array.prototype.f_contains = function(s) {
		for (var i = 0; i < this.length; i++) {
			if (this[i] == s) return true;
		}
		return false;
	};

	// known extensions for downloadable files
	var exts = ['png', 'jpg', 'jpeg', 'gif', 'pdf', 'doc', 'xls', 'ppt', 'zip', 'gz', 'mpg', 'mpeg', 'mov', 'mp4', 'avi', 'wmv', 'mp3', 'wav', 'swf', 'bmp', 'tif', 'tiff', 'svg'];

	var links = document.getElementsByTagName('a');

	for (var i = 0; i < links.length; i++) {
		var link  = links[i];

		// find extension
		var split_slash = link.href.split('/');
		var split_ext   = split_slash[split_slash.length - 1].split('.');
		var ext = split_ext[split_ext.length - 1];

		// check if extension indicates a downloadable file
		if (split_ext.length > 1) {
			if (exts.f_contains(ext)) {
				links[i].target = '_blank';
			}
		}

		// look for links to other sites
		if (link.href.substring(0, 7) == 'http://') {
			if (link.href.substring(7, 7 + window.location.hostname.length) != window.location.hostname) {
				links[i].target = '_blank';
			}
		}
	}

	// known extensions for shadowbox media files
	var s_exts = ['jpg', 'jpeg', 'png', 'gif', 'flv'];

	var s_links = document.getElementsByTagName('a');

	for (var j = 0; j < s_links.length; j++) {
		var s_link  = s_links[j];

		// find extension
		var s_split_slash = s_link.href.split('/');
		var s_split_ext   = s_split_slash[s_split_slash.length - 1].split('.');
		var s_ext = s_split_ext[s_split_ext.length - 1];

		// check if extension indicates a media file
		if (s_split_ext.length > 1) {
			if (s_exts.f_contains(s_ext)) {
				s_links[j].rel = 'shadowbox[all]';
			}
		}
	}

	// Shadowbox options
	var options = {
		flvPlayer:         '/swf/lib/shadowbox/flvplayer.swf'
	};

	Shadowbox.init(options);
});
