vdwCal = {
	// Classes
	eventClass:'event', // Class of event detail links
	eventParentClass:'events', // Class of elements that contains events
	eventWrapperClass: 'wrapper', // Wrapper inside event_details div
	loadingClass: 'loading', // Added class for the wrapper during loading
	// Ids
	eventDetailsId:'event_details', // Id for event details dialog box
	pointerId: 'pointer',
	// Widths and heights
	pointerWidth: 16,
	pointerHeight: 50,
	loadingWidth: 32,
	loadingHeight: 32,
	// Text
	loadingTxt: 'Loading...',
	// Images
	loadingImg: '/assets/templates/farmandwilderness/images/calendar/loading.gif',
	closeImg:'/assets/templates/farmandwilderness/images/calendar/close.png',
	detailsTopPng: '/assets/templates/farmandwilderness/images/calendar/details-top.png',
	detailsBottomPng: '/assets/templates/farmandwilderness/images/calendar/details-bottom.png',
	pointerPng: '/assets/templates/farmandwilderness/images/calendar/pointer.png',
	detailsTopGif: '/assets/templates/farmandwilderness/images/calendar/details-top.gif',
	detailsBottomGif: '/assets/templates/farmandwilderness/images/calendar/details-bottom.gif',
	pointerGif: '/assets/templates/farmandwilderness/images/calendar/pointer.gif',	
	detailsURI:'/assets/snippets/events_calendar/event_details_xml.php',
	init:function() {
		// Get all of the links to event details
		var calEvents = document.getElementsByClassName(vdwCal.eventClass);
		
		// Attach the event to initiate the ajax call
		calEvents.each(function(link) {
			vdwDOM.addEvent(link, 'click', vdwCal.getEventDetails, false);
			link.onclick = function() { return false; } // Safari click fix
		});
		
		// Preload the images
		var preloadImgsSrc = [vdwCal.closeImg, vdwCal.loadingImg, vdwCal.detailsTopPng, vdwCal.detailsBottomPng, vdwCal.pointerPng, vdwCal.detailsTopGif, vdwCal.detailsBottomGif, vdwCal.pointerGif];
		vdwUtil.preloadImgs(preloadImgsSrc);
	},
	getEventDetails:function(e) {
		vdwDOM.cancelClick(e);
		var target = vdwDOM.getTarget(e);
		var parameters = target.href.substring(target.href.indexOf('?'));
		new Ajax.Request(vdwCal.detailsURI, {
			method: 'post',
			parameters: parameters,
			onSuccess: function(transport){
//				var data = transport.responseText;
				var data = transport.responseXML;
				vdwCal.displayDetails(data, target);
			},
			onFailure: function() { alert('Something went wrong...'); },
			onLoading: function() {
				vdwCal.displayLoading(target);
			}
		});
	},
	removeDialogBox:function() {
		// If there is already a dialog box or pointer, remove them
		if ($(vdwCal.eventDetailsId)) {
			$(vdwCal.eventDetailsId).setStyle({ visibility: 'hidden' } ); // Fix for Opera
			$(vdwCal.eventDetailsId).remove();
		}
		if ($(vdwCal.pointerId)) {
			$(vdwCal.pointerId).setStyle({ visibility: 'hidden' } ); // Fix for Opera
			$(vdwCal.pointerId).remove();
		}
	},
	createDialogBox:function() {			
		// Create the dialog box and extend it
		var dialogBox = document.createElement('div');
		dialogBox.id = vdwCal.eventDetailsId;
		Element.extend(dialogBox);
		
		// Create the close link
		var closeImg = document.createElement('img');
		closeImg.setAttribute('src',vdwCal.closeImg);
		closeImg.className = 'close';
		vdwDOM.addEvent(closeImg, 'click', vdwCal.removeDialogBox, false);
		dialogBox.appendChild(closeImg);
		dialogBox.hide();
		
		return dialogBox;
	},
	createPointer:function() {			
		// Create the pointer graphic that connects the dialog box to the event link
		var pointer = document.createElement('div');
		pointer.id = vdwCal.pointerId;
		Element.extend(pointer);
		pointer.hide();		
		return pointer;
	},
	calcDetailSize:function(dialogBox, pointer, target) {
		// Extend the element that fired the event and append the dialog box to its parent element
		Element.extend(target);
		var eventParent = target.up('.' + vdwCal.eventParentClass);
		eventParent.appendChild(dialogBox);
		eventParent.appendChild(pointer);
		
		// Calculate the coordinates and widths of the dialog box and pointers
		var eventLinkCoords = Position.positionedOffset(target);
		var eventParentCoords = Position.positionedOffset(eventParent);
		var eventParentWidth = eventParent.getWidth();
		var dialogBoxWidth = dialogBox.getWidth();
		var dialogBoxHeight = dialogBox.getHeight();
		
		// Size and position the pointer and dialog box
		pointer.setStyle({
			width: vdwCal.pointerWidth + 'px',
			height: vdwCal.pointerHeight + 'px',
			position: 'absolute',
			top: (eventLinkCoords[1] - vdwCal.pointerHeight + 5) + 'px',
			left: (eventParentCoords[0] + ((eventParentWidth - pointer.getWidth())/2)) + 'px'
		});
		dialogBox.setStyle({
			position: 'absolute',
			top: ((eventLinkCoords[1] - dialogBoxHeight) - vdwCal.pointerHeight + 6) + 'px',
			left: (eventParentCoords[0] - ((dialogBoxWidth - eventParentWidth)/2)) + 'px'
		});
		
		// Abracadabra
		pointer.show();
		dialogBox.show();
	},
	displayLoading:function(target) {
		vdwCal.removeDialogBox();

		var dialogBox = vdwCal.createDialogBox();
		var pointer = vdwCal.createPointer();
		
		// Create loading message and append to dialog box
		var loadingDiv = document.createElement('div');
		loadingDiv.className = vdwCal.eventWrapperClass + ' ' + vdwCal.loadingClass;
		var loadingMessage = document.createElement('h3');
		var loadingTxt = document.createTextNode(vdwCal.loadingTxt);
		var loadingImg = document.createElement('img');
		loadingImg.src = vdwCal.loadingImg;
		loadingImg.width = vdwCal.loadingWidth;
		loadingImg.height = vdwCal.loadingHeight;
		loadingMessage.appendChild(loadingTxt);
		loadingDiv.appendChild(loadingMessage);
		loadingDiv.appendChild(loadingImg);
		dialogBox.appendChild(loadingDiv);
		
		// Resize and show dialog box and pointer
		vdwCal.calcDetailSize(dialogBox, pointer, target);
	},
	displayDetails:function(data, target) {
		vdwCal.removeDialogBox();
		
		var dialogBox = vdwCal.createDialogBox();
		var pointer = vdwCal.createPointer();
		
		// Try to import the node
		var detailsHTML = document.createElement('div');
		detailsHTML.className = 'wrapper';
		var details = data.firstChild;
		if (details.nodeType != 1) {
			details = details.nextSibling;
		}
		var detailsImport = vdwDOM.importNode(details, true);
		detailsHTML.appendChild(detailsImport);	
		dialogBox.appendChild(detailsHTML);	
		
		// Resize and show dialog box and pointer
		vdwCal.calcDetailSize(dialogBox, pointer, target);
	}
}

vdwDOM.addEvent(window, 'load', vdwCal.init, false);