var g_interestMap = null;
var g_interestMapPoints = new Array();
var g_interestMapCenter = null;
var g_interestMapZoom = 1;
var g_currPoint = null;
var MODULE_INTEREST_MAP_ADMIN_RETRIEVE_POINT_URL = '/interest-map-admin/get-point';
var MODULE_INTEREST_MAP_ADMIN_DELETE_POINT_URL = '/interest-map-admin/delete-point';

function InterestMapShowPoint(pointIndex) { /* <<<( */

	var marker = null;
	var infoWindow = null;

	if ((0 <= pointIndex) && (g_interestMapPoints.length > pointIndex)) {

		// get marker and info window objects
		google.maps.event.trigger(g_interestMapPoints[pointIndex].marker, 'click');
	}

	location.href = location.href.toString().substr(0, location.href.toString().lastIndexOf('#')) + '#module-interest-map-display';

	return;
} /* )>>> */

function ModuleInterestMapInitialize() { /* <<<( */

	var mapOptions = {
		zoom: g_interestMapZoom,
		center: g_interestMapCenter,
		mapTypeId: google.maps.MapTypeId.HYBRID
	};

	// create map
	g_interestMap = new google.maps.Map(document.getElementById('module-interest-map'), mapOptions);

	// create markers for all points.  Created the associated info windows for each marker
	for (var index = 0; index < g_interestMapPoints.length; index++) {

		// create marker for map
		InterestMapAttachMarker(g_interestMapPoints[index]);
	}

	return;
} /* )>>> */

function InterestMapAttachMarker(interestMapPoint) { /* <<<( */

	var markerLocation = null;
	var marker = null;
	var content = '';

	// get latitude and longitude of point
	var markerLocation = new google.maps.LatLng(interestMapPoint.markerLat, interestMapPoint.markerLng);

	// create marker for point
	var marker = new google.maps.Marker({
		position: markerLocation,
		map: g_interestMap,
		title: interestMapPoint.title,
		icon: interestMapPoint.markerImage,
		shadow: interestMapPoint.markerImageShadow
	});

	// create content of info window for marker
	var content = interestMapPoint.description;

	// add info window to marker
	var infoWindow = InterestMapAttachInfoWindow(marker, content);

	// add marker and info window to this point
	interestMapPoint.marker = marker;
	interestMapPoint.infoWindow = infoWindow;

	return;
} /* )>>> */

function InterestMapAttachInfoWindow(marker, content) { /* <<<( */

	var infoWindow = null;
	var currmarker = 0;

	// create info window
	infoWindow = new google.maps.InfoWindow({
		content: content
	});

	google.maps.event.addListener(marker, 'click', function() {

		// close all open info windows
		for (var index = 0; g_interestMapPoints.length > index; index++) {

			if (marker == g_interestMapPoints[index].marker) {
				currMarker = index;
			}
			else {
				g_interestMapPoints[index].infoWindow.close();
				g_interestMapPoints[index].marker.setIcon(g_interestMapPoints[index].markerImage);
				g_interestMapPoints[index].marker.setShadow(g_interestMapPoints[index].markerImageShadow);
			}
		}

		marker.setIcon(g_interestMapPoints[currMarker].markerImageSelected);
		marker.setShadow(g_interestMapPoints[currMarker].markerImageSelectedShadow);
		g_currPoint = g_interestMapPoints[currMarker];

		// open this info window
		infoWindow.open(g_interestMap, marker);

		// center map on marker
		g_interestMap.panTo(marker.getPosition());
	});

	google.maps.event.addListener(infoWindow, 'closeclick', function() {
		g_interestMap.panTo(g_interestMapCenter);
		g_currPoint.marker.setIcon(g_currPoint.markerImage);
		g_currPoint.marker.setShadow(g_currPoint.markerImageShadow);
	});

	return infoWindow;
} /* )>>> */

function InterestMapPoint(id, title, description, markerImage, markerImageShadow, markerImageSelected, markerImageSelectedShadow, markerLat, markerLng) { /* <<<( */

	id = id.substr(id.lastIndexOf('-') + 1);

	this.id = id;
	this.title = title;
	this.description = description;
	this.markerImage = markerImage;
	this.markerImageShadow = markerImageShadow;
	this.markerImageSelected = markerImageSelected;
	this.markerImageSelectedShadow = markerImageSelectedShadow;
	this.markerLat = markerLat;
	this.markerLng = markerLng;
	this.marker = null;
	this.infoWindow = null;
} /* )>>> */

function ModuleInterestMapAdminEdit(pointId) { /* <<<( */

	var response = null;

	// fetch data to populate form with
	response = ModuleInterestMapAdminRetrievePoint(pointId);

	// process the response
	if ((null != response) && (null != response.getElementsByTagName('message')) &&
		('success' == response.getElementsByTagName('message')[0].getAttribute('type')))
	{
		// populate fields
		ModuleInterestMapAdminPopulateEditor(response);

		// display form
		ModuleInterestMapAdminDisplayEditor('edit');
	}
	else {
		// failure
		alert("Sorry, the point could not be retrieved from the database.\nPlease refresh the page and try again.");
	}

	return;
} /* )>>> */

function ModuleInterestMapAdminGetXmlRequest() { /* <<<( */

	var obj_xml_request = null;

	// firefox, Opera, Safari
	try {
		obj_xml_request = new XMLHttpRequest();
	}
	catch (e) {

		// Internet Explorer
		try {
			obj_xml_request = new ActiveXObject('Msxml2.XMLHTTP');
		}
		catch (e) {

			// Internet Explorer (alternative)
			try {
				obj_xml_request = new ActiveXObject('Microsoft.XMLHTTP');
			}
			catch (e) {
				alert('Sorry, your browser does not support AJAX.');
			}
		}
	}

	return obj_xml_request;
} /* )>>> */

function ModuleInterestMapAdminRetrievePoint(pointId) { /* <<<( */

	var pointToRetrieve = ModuleInterestMapAdminParseId(pointId);
	var requestUrl = MODULE_INTEREST_MAP_ADMIN_RETRIEVE_POINT_URL;
	var params = '';
	var response = null;
	var xmlRequest = ModuleInterestMapAdminGetXmlRequest();

	params += 'module-interest-map-admin-point-id=' + pointToRetrieve;
	requestUrl = requestUrl + '?' + params;

	xmlRequest.open('GET', requestUrl, false);
	xmlRequest.send(null);

	// get document element
	if (null != xmlRequest.responseXML) {
		response = xmlRequest.responseXML.documentElement;
	}

	return response;
} /* )>>> */

function ModuleInterestMapAdminPopulateEditor(response) { /* <<<( */

	if ((null != document.getElementById('module-interest-map-admin-editor-input-id')) &&
		(null != response.getElementsByTagName('interest-point')[0]) &&
		('' != response.getElementsByTagName('interest-point')[0].getAttribute('id')))
	{
		document.getElementById('module-interest-map-admin-editor-input-id').value = ModuleInterestMapAdminParseId(response.getElementsByTagName('interest-point')[0].getAttribute('id'));
	}

	if ((null != document.getElementById('module-interest-map-admin-editor-input-title')) &&
		(null != response.getElementsByTagName('title')[0]) &&
		(null != response.getElementsByTagName('title')[0].childNodes[0]))
	{
		document.getElementById('module-interest-map-admin-editor-input-title').value = response.getElementsByTagName('title')[0].childNodes[0].nodeValue;
	}

	if ((null != document.getElementById('module-interest-map-admin-editor-input-description')) &&
		(null != response.getElementsByTagName('description')[0]) &&
		(null != response.getElementsByTagName('description')[0].childNodes[0]))
	{
		var xmlText = '';
		if ('undefined' != typeof XMLSerializer) {
			childNodesCount = response.getElementsByTagName('description')[0].childNodes.length;
			for (var node = 0; childNodesCount > node; node++) {
				xmlText += (new XMLSerializer()).serializeToString(response.getElementsByTagName('description')[0].childNodes[node]);
			}
		}
		else {
			xmlText = response.getElementsByTagName('description')[0].childNodes[0].xml;
		}
		document.getElementById('module-interest-map-admin-editor-input-description').value = xmlText;
		ckEditor.setData(xmlText);
	}

	if ((null != document.getElementById('module-interest-map-admin-editor-input-link')) &&
		(null != response.getElementsByTagName('url')[0]) &&
		(null != response.getElementsByTagName('url')[0].childNodes[0]))
	{
		document.getElementById('module-interest-map-admin-editor-input-link').value = response.getElementsByTagName('url')[0].childNodes[0].nodeValue;
	}

	if ((null != document.getElementById('module-interest-map-admin-editor-input-latitude')) &&
		(null != response.getElementsByTagName('latitude')[0]) &&
		(null != response.getElementsByTagName('latitude')[0].childNodes[0]))
	{
		document.getElementById('module-interest-map-admin-editor-input-latitude').value = response.getElementsByTagName('latitude')[0].childNodes[0].nodeValue;
	}

	if ((null != document.getElementById('module-interest-map-admin-editor-input-longitude')) &&
		(null != response.getElementsByTagName('longitude')[0]) &&
		(null != response.getElementsByTagName('longitude')[0].childNodes[0]))
	{
		document.getElementById('module-interest-map-admin-editor-input-longitude').value = response.getElementsByTagName('longitude')[0].childNodes[0].nodeValue;
	}

	return;
} /* )>>> */

function ModuleInterestMapAdminParseId(elementId) { /* <<<( */

	var id = 0; // id to return
	var parsePos = -1; // position in string to start parsing the id

	// get position to start parsing
	parsePos = elementId.lastIndexOf('-');
	if (-1 < parsePos) {
		// move past the '-'
		parsePos++;
	}
	else {
		// assume entire string is id
		parsePos = 0;
	}

	// parse the id from the string
	id = elementId.substr(parsePos);

	return id;
} /* )>>> */

function ModuleInterestMapAdminDisplayEditor(editorType) { /* <<<( */

	var editForm = document.getElementById('module-interest-map-admin-editor-container');
	var clientY = 0;
	var clientX = 0;
	var editFormOffset = 0;
	var windowHeight = 0;
	var windowWidth = 0;
	var scrollPos = 0;
	var position = 0;
	var editorTitle = '';

	if (null != editForm) {

		// set editor title
		if ('edit' == editorType.toLowerCase()) {
			editorTitle = 'Edit Point';
		}
		else if ('add' == editorType.toLowerCase()) {
			editorTitle = 'Add Point';
		}
		else {
			editorTitle = 'Point Editor';
		}
		document.getElementById('module-interest-map-admin-editor-title').innerHTML = editorTitle;

		// get height of document
		clientY = document.body.scrollHeight + 50;

		// display background
		if (null != document.getElementById('module-interest-map-admin-editor-background')) {
			document.getElementById('module-interest-map-admin-editor-background').style.height = clientY + 'px';
			document.getElementById('module-interest-map-admin-editor-background').style.display = 'block';
		}
		editForm.style.display = 'block';

		// get offset of parents of edit detail container
		editFormOffset = ModuleInterestMapAdminGetOffsetTop(editForm);

		// get the height of the window
		if (!window.innerHeight) {

			// we are IE
			if (0 == document.documentElement.clientHeight) {
				// we are IE quirks mode
				windowHeight = document.body.clientHeight;
				windowWidth = document.body.clientWidth;
			}
			else { // we are IE strict
				windowHeight = document.documentElement.clientHeight;
				windowWidth = document.documentElement.clientWidth;
			}
		}
		else {
			// we are non-IE
			windowHeight = window.innerHeight;
			windowWidth = window.innerWidth;
		}

		// get scrollbar position
		scrollPos = 0;
		if ('number' == typeof(window.pageYOffset)) {
			// non-IE
			scrollPos = window.pageYOffset;
		} else if (document.body && document.body.scrollTop) {
			// DOM compliant IE
			scrollPos = document.body.scrollTop;
		} else if (document.documentElement && document.documentElement.scrollTop) {
			//IE6 standards compliant mode
			scrollPos = document.documentElement.scrollTop;
		}

		// calculation: we want the middle of the editor to be in the center of the screen
		position = scrollPos + (windowHeight / 2);

		// at this point, we have the top of the editor at the middle of the screen, need to move up half the height of the editor
		position = position - (editForm.clientHeight / 2) - editFormOffset;
		if (0 >= position) {
			position = 10;
		}

		// set top of editor
		editForm.style.top = position + 'px';

		// calcuation: we want the middle of the editor to be in the center of the screen
		position = (windowWidth / 2) - (parseInt(editForm.clientWidth, 10) / 2);

		// set left of editor
		editForm.style.left = position + 'px';
	}

	return;
} /* )>>> */

function ModuleInterestMapAdminGetOffsetTop(elem) { /* <<<( */

	var height = 0;

	if (null != elem) {

		while (elem = elem.offsetParent) {
			height += elem.offsetTop;
		}
	}

	return height;
} /* )>>> */

function ModuleInterestMapAdminCancelEdit() { /* <<<( */

	// clear form
	ModuleInterestMapAdminClearEditor();

	// hide form and background
	if (null != document.getElementById('module-interest-map-admin-editor-container')) {
		document.getElementById('module-interest-map-admin-editor-container').style.display = 'none';
	}

	if (null != document.getElementById('module-interest-map-admin-editor-background')) {
		document.getElementById('module-interest-map-admin-editor-background').style.display = 'none';
	}

	return;
} /* )>>> */

function ModuleInterestMapAdminClearEditor() { /* <<<( */

	if (null != document.getElementById('module-interest-map-admin-editor-warning-message')) {
		document.getElementById('module-interest-map-admin-editor-warning-message').style.display = 'none';
	}

	if (null != document.getElementById('module-interest-map-admin-editor-input-id')) {
		document.getElementById('module-interest-map-admin-editor-input-id').value = '';
	}

	if (null != document.getElementById('module-interest-map-admin-editor-input-title')) {
		document.getElementById('module-interest-map-admin-editor-input-title').value = '';
	}

	if (null != document.getElementById('module-interest-map-admin-editor-input-description')) {
		document.getElementById('module-interest-map-admin-editor-input-description').value = '';
	}

	if (null != document.getElementById('module-interest-map-admin-editor-input-link')) {
		document.getElementById('module-interest-map-admin-editor-input-link').value = '';
	}

	if (null != document.getElementById('module-interest-map-admin-editor-input-latitude')) {
		document.getElementById('module-interest-map-admin-editor-input-latitude').value = '';
	}

	if (null != document.getElementById('module-interest-map-admin-editor-input-longitude')) {
		document.getElementById('module-interest-map-admin-editor-input-longitude').value = '';
	}

	return;
} /* )>>> */

function ModuleInterestMapAdminCheckRequiredFields() { /* <<<( */

	var submitForm = false; // whether or not to submit the form
	var message = ''; // message to display if form is not submitted
	var validDateMessage = '';  // message to display if date is not valid
	var validRepeatDateMessage = '';  // message to display if recurring dates are not valid
	var validEmailMessage = true;  // whether or not email field is valid

	// check that required fields are non-null
	if ((null == document.getElementById('module-interest-map-admin-editor-input-title')) ||
		('' == ModuleInterestMapAdminTrim(document.getElementById('module-interest-map-admin-editor-input-title').value)))
	{
		message += "\tTitle\n";
	}

	// check that required fields are non-null
	if ((null == document.getElementById('module-interest-map-admin-editor-input-link')) ||
		('' == ModuleInterestMapAdminTrim(document.getElementById('module-interest-map-admin-editor-input-link').value)))
	{
		message += "\tLink\n";
	}

	// check that required fields are non-null
	if ((null == document.getElementById('module-interest-map-admin-editor-input-latitude')) ||
		('' == ModuleInterestMapAdminTrim(document.getElementById('module-interest-map-admin-editor-input-latitude').value)))
	{
		message += "\tLatitude\n";
	}

	// check that required fields are non-null
	if ((null == document.getElementById('module-interest-map-admin-editor-input-longitude')) ||
		('' == ModuleInterestMapAdminTrim(document.getElementById('module-interest-map-admin-editor-input-longitude').value)))
	{
		message += "\tLongitude\n";
	}

	// check if errors occurred
	if ('' != message) {
		message = "The following fields are required:\n" + message + "\n";
	}

	// check for error messages
	if ('' != message) {
		message += "\n"; // for extra padding at bottom of message
		alert(message);
	}
	else {
		// set redirect if available
		if (null != document.getElementById('module-interest-map-admin-editor-form-redirect')) {
			document.getElementById('module-interest-map-admin-editor-form-redirect').value = window.location.href.toString();
		}

		// allow form to be submitted
		submitForm = true;
	}

	return submitForm;
} /* )>>> */

function ModuleInterestMapAdminDelete(pointId) { /* <<<( */

	var response = null;

	if (true == confirm("Are you sure you wish to delete this point?\nThis operation cannot be undone.\n")) {

		// fetch data to populate form with
		response = ModuleInterestMapAdminDeletePoint(pointId);

		// process the response
		if ((null != response) && (null != response.getElementsByTagName('message')) &&
			('success' == response.getElementsByTagName('message')[0].getAttribute('type')))
		{
			ModuleInterestMapAdminHidePoint(pointId);
			alert("Point successfully deleted.");
		}
		else {
			// failure
			alert("Sorry, the point could not be retrieved from the database.\nPlease refresh the page and try again.");
		}
	}

	return;
} /* )>>> */

function ModuleInterestMapAdminDeletePoint(pointId) { /* <<<( */

	var pointToDelete = ModuleInterestMapAdminParseId(pointId);
	var requestUrl = MODULE_INTEREST_MAP_ADMIN_DELETE_POINT_URL;
	var params = '';
	var response = null;
	var xmlRequest = ModuleInterestMapAdminGetXmlRequest();

	params += 'module-interest-map-admin-point-id=' + pointToDelete;
	requestUrl = requestUrl + '?' + params;

	xmlRequest.open('GET', requestUrl, false);
	xmlRequest.send(null);

	// get document element
	if (null != xmlRequest.responseXML) {
		response = xmlRequest.responseXML.documentElement;
	}

	return response;
} /* )>>> */

function ModuleInterestMapAdminAdd() { /* <<<( */

	ModuleInterestMapAdminDisplayEditor('add');

	return;
} /* )>>> */

function ModuleInterestMapAdminHidePoint(pointId) { /* <<<( */

	if (null != document.getElementById('module-interest-map-admin-point-container-' + pointId)) {
		document.getElementById('module-interest-map-admin-point-container-' + pointId).style.display = 'none';
	}

	return;
} /* )>>> */

/*--------------------------------------------------------------------------*/
/**
	@brief Removes leading and trailing whitespace from a given string.
	@param value String to remove leading and trailing whitespace from.
	@return String with leading and trailling whitespace removed.
 */
function ModuleInterestMapAdminTrim(value) { /* <<<( */

	var trimmedValue = '';

	// remove leading and trailing whitespace
	trimmedValue = value.replace(/^\s*|\s*$/g, '');

	return trimmedValue;
} /* )>>> */

// add code to load on window initialization
if (null == window.onload) {
	window.onload = ModuleInterestMapInitialize;
}
else {
	currentLoadFunc = window.onload;
	window.onload = function() {
		currentLoadFunc();
		ModuleInterestMapInitialize();
	}
}


