/***************************************
 
 Ajax Maps
 by Will Peavy, will.peavy@orlandocvb.com
 
 API References:
 	http://code.google.com/apis/maps/documentation/v3/reference.html
 	http://api.jquery.com/
 
***************************************/

$(function () {

	/* create global variables */
	var bubble_current, color, coordinates, latitude, latLng, longitude, map, map_zoom;
	
	/* create global arrays */
	var arr_bubbleList = [];
	var arr_listLandmarks = [];
	var arr_markerList = [];
	var arr_marker = [];
	var arr_markerLandmark = [];
	var arr_overCor = [];
	var arr_overPID = [];
	
	/* direction elements */
	var dir_input_from = $('#directions-from');
	var dir_input_to = $('#directions-to');
	var dir_results = document.getElementById('direction-results');

	/* shorten text */
	var txt_directions = 'Directions: <a href="directions-from">From here</a> - <a href="directions-to">To here</a>';

	/* gather cookies */
	var cke_mbrName = $.cookie('mbrName');
	var cke_mbrAddress = $.cookie('mbrAddress');
	var cke_mbrURL = $.cookie('mbrURL');
	var cke_mbrPhone = $.cookie('mbrPhone');
	var cke_tabType = $.cookie('tabType');
	var cke_mapType = $.cookie('mapType');
	var cke_mapSite = $.cookie('mapSite');
	var cke_mbrDirectory = $.cookie('mbrDir');
			cke_mbrDirectory = cke_mbrDirectory.replace('trade', '');
	
	/* scale size of map and left-column */
	var doc_height = $(document).height();
	var doc_width = $(document).width();
	$('#map-canvas').css('height', doc_height - 16);
	$('#left-column > div').css('height', doc_height - 56);
	$('#map-canvas').css('width', doc_width - 330);
	
	/* set overrides */
	(function() {
		$.ajax({
			type: 'GET',
			url: 'overrides.xml',
			dataType: 'xml',
			success: function (xml) {
				i = 0;
				$(xml).find('member').each(function () {
					var partnerid_ovr = $(this).attr('partnerid');
					var coords_ovr = $(this).text();
					arr_overPID[i] = partnerid_ovr;
					arr_overCor[i] = coords_ovr;
					i++;
				});
			}
		});
	}());
	
	/* set data source */
	if (cke_mapSite === 'meetings') {
		var xmlSrc = 'map-meetings.xml';
	}
	else {
		var xmlSrc = 'maps.xml';
	}
	
	/* if splashpage or search results page, find current member and call writeMap() */
	if (cke_mapType === 'member') {
		
		$.ajax({	
			
			type: 'GET',
			url: xmlSrc,
			dataType: 'xml',
			success: function (xml) {	

				var i = 0;
				
				$(xml).find('location').each(function () {
					
					if (i === 0) {
						
						mbrCurrent = $(this).attr('id');
						
						if (mbrCurrent === cke_mbrName) {
							
							map_zoom = 14;
							coordinates = $(this).find('coordinates').text();
							var partnerid = $(this).find('partnerid').text();
							
							$.each(arr_overPID, function(key, value) { 
								if (partnerid === value) {
									coordinates = arr_overCor[key];
								}
							});
							
							if (cke_tabType === 'directions') {
								dir_input_to.attr('latlng', coordinates);
							}
							
							writeMap();
							
							i = 1;
							
						}
						
					}	
					
				});
				
			}
			
		});
	}
	
	/* else if main page, center on visitors center and call writeMap() */
	else {
		coordinates = '28.4397356, -81.4708626';
		map_zoom = 13;
		writeMap();
	}

	/* draw map and landmarks */
	function writeMap() {

		var split_coordinates = coordinates.split(',');
		latLng = new google.maps.LatLng(split_coordinates[0], split_coordinates[1]);
		
		var map_settings = {
			zoom: map_zoom,
			center: latLng,
			mapTypeId: google.maps.MapTypeId.ROADMAP
		};
		
		map = new google.maps.Map(document.getElementById('map-canvas'), map_settings);
		
		if (cke_mapType === 'member') {
		
			var marker_icon = new google.maps.MarkerImage('/globalmaps/images/markers/marker.default.png');
			var marker_mbrCurrent = new google.maps.Marker({
				position: latLng,
				map: map,
				icon: marker_icon,
				title: cke_mbrName
			});
			
			var mbr_splashURL = cke_mbrURL;
			var mbr_splashLink = '<a href="' + mbr_splashURL + '" target="_top">More info</a>';
			var bubble_content = '<p class="bubble" latlng="' + latLng + '"><strong>' + cke_mbrName + '</strong><br>' + '<span class="address">' + cke_mbrAddress + '</span><br>' + mbr_splashLink + '<br>' + cke_mbrPhone + '<br><br>' + txt_directions + '</p>';
			
			bubble_current = new google.maps.InfoWindow({
				content: bubble_content
			});
			
			arr_bubbleList.push(bubble_current);
			
			bubble_current.open(map, marker_mbrCurrent);
	
			google.maps.event.addListener(marker_mbrCurrent, 'click', function () {
				$.each(arr_bubbleList, function(key, value) {  
					this.close();
				});
				bubble_current.open(map, marker_mbrCurrent);
			});
		
		}

		google.maps.event.addListener(map, 'zoom_changed', function () {
			map_zoom = this.getZoom();
			if (map_zoom < 12) {
				$(arr_listLandmarks).each(function () {
					this.setVisible(false);
				});
			}
			else {
				$(arr_listLandmarks).each(function () {
					this.setVisible(true);
				});
			}
		});

		$.ajax({

			type: 'GET',
			url: 'landmarks.xml',
			dataType: 'xml',
			success: function (xml) {

				var i = 0;

				$(xml).find('location').each(function () {

					var mbr_id = $(this).attr('id');
					var mbr_coords = $(this).find('coordinates').text();
					var mbr_icon = $(this).find('icon').text();
					var mbr_partnerID = $(this).find('partnerid').text();
					var mbr_address = $(this).find('address').text();
					var mbr_cityStaZip = $(this).find('csz').text();
					var split_coordinates = mbr_coords.split(',');
					var mbr_latLng = new google.maps.LatLng(split_coordinates[0], split_coordinates[1]);
					var mbr_iconType;

					if (mbr_icon != 'text') {
						mbr_iconType = mbr_icon;
					}
					else {
						mbr_iconType = 'text-only.png';
					}

					var marker_icon = new google.maps.MarkerImage('/globalmaps/images/landmarks/' + mbr_iconType);

					arr_markerLandmark[i] = new google.maps.Marker({
						position: mbr_latLng,
						map: map,
						icon: marker_icon,
						title: mbr_id
					});

					arr_markerLandmark[i].setZIndex(1);

					if (mbr_partnerID === 'null') {

						var bubble_content = '<p class="bubble" latlng="' + mbr_coords + '"><strong>' + mbr_id + '</strong><br>' + '<span class="address">' + mbr_address + '<br>' + mbr_cityStaZip + '</span><br><br>' + txt_directions + '</p>';

					}

					else {

						var mbr_phone = $(this).find('phone').text();
						var mbr_splashURL = $(this).find('splash').text();
						var mbr_splashLink = '<a href="' + mbr_splashURL + '" target="_top">More info</a>';

						var bubble_content = '<p class="bubble" latlng="' + mbr_coords + '"><strong>' + mbr_id + '</strong><br>' + '<span class="address">' + mbr_address + '<br>' + mbr_cityStaZip + '</span><br>' + mbr_splashLink + '<br>' + mbr_phone + '<br><br>' + txt_directions + '</p>';

					}

					var bubble = new google.maps.InfoWindow({
						content: bubble_content
					});
					
					arr_bubbleList.push(bubble);
					
					google.maps.event.addListener(arr_markerLandmark[i], 'click', function () {
						$.each(arr_bubbleList, function(key, value) {  
							this.close();
						});
						bubble.open(map, this);
					});

					arr_listLandmarks.push(arr_markerLandmark[i]);

					i++;

				});

			}

		});

	}
	
	/* write categories and subcategories in left column */
	$.ajax({

		type: 'GET',
		url: xmlSrc,
		dataType: 'xml',
		success: function (xml) {

			var i = 0;
			
			$(xml).find('category').each(function () {

				var arr_category = [];
				var cat_id = $(this).attr('id');
				var cat_idLowercase = cat_id.toLowerCase();
				var j = 0;
				
				$(this).find('subcategory').each(function () {
					var sub_id = $(this).attr('id');
					var sub_idClean = sub_id.replace(/[ ,\/]/g, '-');
					arr_category.push('<input type="checkbox" id="' + sub_idClean + '"> <label for=' + sub_idClean + '>' + sub_id + '</label><br>');
					j++;
				});
				
				setColor(i);
				
				var marker = '<img src="/globalmaps/images/markers/marker.' + color + '.png" alt="">';
				
				var str_category = arr_category + '';
						str_category = str_category.replace(/\<br\>\,/g, '<br>');
				
				if (j > 1) {
					var checkAll = '<input type="checkbox" id="check-all' + i + '" class="check-all"> <label for="check-all' + i + '"><em>Select all ' + cat_id + '</em></label><br>';
				}
				else {
					var checkAll = '';
				}

				if (cke_mbrDirectory === cat_idLowercase) {
					$('#categories').append('<h2 id="category-' + cat_id + '" class="open">' + cat_id + marker + '</h2>' + '<div class="checkboxes" style="display:block">' + checkAll + str_category + '</div>');
				}
				else {
					$('#categories').append('<h2 id="category-' + cat_id + '" class="closed">' + cat_id + marker + '</h2>' + '<div class="checkboxes">' + checkAll + str_category + '</div>');
				}

				i++;
			
			});

		}

	});
	
	/* if user comes from 'Get Directions' link, default to directions tab view */
	if (cke_tabType === 'directions') {
		var cleanAddress = cke_mbrAddress.replace(/<br>/g, ' ');
		$('#tab-categories').removeClass('active');
		$('#tab-directions').addClass('active');
		$('#categories').hide();
		$('#directions').show();
		dir_input_from.focus();
		dir_input_to.val(cleanAddress);
	}
	
	/* set marker colors */
	function setColor(num) {
		switch (num) {
			case 0:
				color = 'blue';
				break;
			case 1:
				color = 'pigment-blue';
				break;
			case 2:
				color = 'burnt-orange';
				break;
			case 3:
				color = 'green';
				break;
			case 4:
				color = 'light-orange';
				break;
			case 5:
				color = 'black';
				break;
			case 6:
				color = 'light-orange';
				break;
			case 7:
				color = 'blue';
				break;
			case 8:
				color = 'pink';
				break;
			case 9:
				color = 'purple';
				break;
			case 10:
				color = 'red';
				break;
			case 11:
				color = 'yellow';
				break;
			case 12:
				color = 'teal';
				break;
		}
	}
	
	/* add markers to map and array when category is checked */
	$('#categories input:checked').live('click', function () {
		
		var checked_id = $(this).attr('id').replace(/[-,\/]/g, ' ');
		var isCheckAll = checked_id.indexOf('check');
		
		if (isCheckAll === 0) {
			
			$(this).parent().find('input').attr('checked','checked');
			
			$.ajax({

				type: 'GET',
				url: xmlSrc,
				dataType: 'xml',
				success: function (xml) {
					
					$('#categories input:checked').each(function () {
	
						var checked_id = $(this).attr('id').replace(/[-,\/]/g, ' ');
						
						var i = 0;
	
						$(xml).find('subcategory').each(function () {
		
							var coordinates_ovr, partnerid_ovr;
							var sub_id = $(this).attr('id').replace(/[-,\/]/g, ' ');
		
							if (sub_id === checked_id) {
								
								$(this).find('location').each(function () {

									var mbr_id = $(this).attr('id');
									var coordinates = $(this).find('coordinates').text();
									var mbr_address = $(this).find('address').text();
									var mbr_cityStaZip = $(this).find('csz').text();
									var mbr_phone = $(this).find('phone').text();
									var mbr_splashURL = $(this).find('splash').text();
									var mbr_splashLink = '<a href="' + mbr_splashURL + '" target="_top">More info</a>';
									var partnerid = $(this).find('partnerid').text();

									$.each(arr_overPID, function(key, value) { 
										if (partnerid === value) {
											coordinates = arr_overCor[key];
										}
									});
									
									var split_coordinates = coordinates.split(',');
									var mbr_latLng = new google.maps.LatLng(split_coordinates[0], split_coordinates[1]);
									
									var categoryIndex = $(this).parents('category').index();
									setColor(categoryIndex);
									var marker_icon = new google.maps.MarkerImage('/globalmaps/images/markers/marker.' + color + '.png');
									
									arr_marker[i] = new google.maps.Marker({
										position: mbr_latLng,
										map: map,
										icon: marker_icon,
										title: mbr_id
									});
		
									arr_marker[i].setZIndex(2);
		
									var bubble_content = '<p class="bubble" latlng="' + coordinates + '"><strong>' + mbr_id + '</strong><br>' + '<span class="address">' + mbr_address + '<br>' + mbr_cityStaZip + '</span><br>' + mbr_splashLink + '<br>' + mbr_phone + '<br><br>' + txt_directions + '</p>';
		
									var bubble = new google.maps.InfoWindow({
										content: bubble_content
									});
									
									arr_bubbleList.push(bubble);
									
									google.maps.event.addListener(arr_marker[i], 'click', function () {
										$.each(arr_bubbleList, function(key, value) {  
											this.close();
										});
										bubble.open(map, this);
									});
		
									arr_markerList.push(arr_marker[i]);
		
									i++;
		
								});
		
							};
		
						});
	
					});
	
				}
	
			});
			
		}
		
		else {

			$.ajax({
	
				type: 'GET',
				url: xmlSrc,
				dataType: 'xml',
				success: function (xml) {
	
					var i = 0;
	
					$(xml).find('subcategory').each(function () {
	
						var sub_id = $(this).attr('id').replace(/[-,\/]/g, ' ');
	
						if (sub_id === checked_id) {
	
							$(this).find('location').each(function () {
	
								var mbr_id = $(this).attr('id');
								var coordinates = $(this).find('coordinates').text();
								var mbr_address = $(this).find('address').text();
								var mbr_cityStaZip = $(this).find('csz').text();
								var mbr_phone = $(this).find('phone').text();
								var mbr_splashURL = $(this).find('splash').text();
								var mbr_splashLink = '<a href="' + mbr_splashURL + '" target="_top">More info</a>';
								var partnerid = $(this).find('partnerid').text();
								
								$.each(arr_overPID, function(key, value) { 
									if (partnerid === value) {
										coordinates = arr_overCor[key];
									}
								});
								
								var split_coordinates = coordinates.split(',');
								var mbr_latLng = new google.maps.LatLng(split_coordinates[0], split_coordinates[1]);
								
								var categoryIndex = $(this).parents('category').index();
								setColor(categoryIndex);
								var marker_icon = new google.maps.MarkerImage('/globalmaps/images/markers/marker.' + color + '.png');
								
								arr_marker[i] = new google.maps.Marker({
									position: mbr_latLng,
									map: map,
									icon: marker_icon,
									title: mbr_id
								});
	
								arr_marker[i].setZIndex(2);
	
								var bubble_content = '<p class="bubble" latlng="' + coordinates + '"><strong>' + mbr_id + '</strong><br>' + '<span class="address">' + mbr_address + '<br>' + mbr_cityStaZip + '</span><br>' + mbr_splashLink + '<br>' + mbr_phone + '<br><br>' + txt_directions + '</p>';
	
								var bubble = new google.maps.InfoWindow({
									content: bubble_content
								});
								
								arr_bubbleList.push(bubble);
								
								google.maps.event.addListener(arr_marker[i], 'click', function () {
									$.each(arr_bubbleList, function(key, value) {  
										this.close();
									});
									bubble.open(map, this);
								});
	
								arr_markerList.push(arr_marker[i]);
	
								i++;
	
							});
	
						};
	
					});
	
				}
	
			});
		
		}

	});

	/* remove markers from map and array when category is unchecked */
	$('#categories input:not(:checked)').live('click', function () {

		var checked_id = $(this).attr('id').replace(/[-,\/]/g, ' ');
		var isCheckAll = checked_id.indexOf('check');
		if (isCheckAll === 0) {
			$(this).parent().find('input').removeAttr('checked');
		}
		
		$(arr_markerList).each(function () {
			this.setMap(null);
		});

		arr_markerList = [];

		$.ajax({

			type: 'GET',
			url: xmlSrc,
			dataType: 'xml',
			success: function (xml) {
				
				$('#categories input:checked').each(function () {

					var checked_id = $(this).attr('id').replace(/[-,\/]/g, ' ');
					
					var i = 0;

					$(xml).find('subcategory').each(function () {
	
						var sub_id = $(this).attr('id').replace(/[-,\/]/g, ' ');
	
						if (sub_id === checked_id) {
	
							$(this).find('location').each(function () {
	
								var mbr_id = $(this).attr('id');
								var coordinates = $(this).find('coordinates').text();
								var mbr_address = $(this).find('address').text();
								var mbr_cityStaZip = $(this).find('csz').text();
								var mbr_phone = $(this).find('phone').text();
								var mbr_splashURL = $(this).find('splash').text();
								var mbr_splashLink = '<a href="' + mbr_splashURL + '" target="_top">More info</a>';
								var partnerid = $(this).find('partnerid').text();
								
								$.each(arr_overPID, function(key, value) { 
									if (partnerid === value) {
										coordinates = arr_overCor[key];
									}
								});
								
								var split_coordinates = coordinates.split(',');
								var mbr_latLng = new google.maps.LatLng(split_coordinates[0], split_coordinates[1]);
								
								var categoryIndex = $(this).parents('category').index();
								setColor(categoryIndex);
								var marker_icon = new google.maps.MarkerImage('/globalmaps/images/markers/marker.' + color + '.png');
								
								arr_marker[i] = new google.maps.Marker({
									position: mbr_latLng,
									map: map,
									icon: marker_icon,
									title: mbr_id
								});
	
								arr_marker[i].setZIndex(2);
	
								var bubble_content = '<p class="bubble" latlng="' + coordinates + '"><strong>' + mbr_id + '</strong><br>' + '<span class="address">' + mbr_address + '<br>' + mbr_cityStaZip + '</span><br>' + mbr_splashLink + '<br>' + mbr_phone + '<br><br>' + txt_directions + '</p>';
	
								var bubble = new google.maps.InfoWindow({
									content: bubble_content
								});
								
								arr_bubbleList.push(bubble);
								
								google.maps.event.addListener(arr_marker[i], 'click', function () {
									$.each(arr_bubbleList, function(key, value) {  
										this.close();
									});
									bubble.open(map, this);
								});
	
								arr_markerList.push(arr_marker[i]);
	
								i++;
	
							});
	
						};
	
					});

				});

			}

		});

	});

	/* expand/collapse categories */
	$('#categories').delegate('h2.closed', 'click', function () {
		var opn = $(this).addClass('open').removeClass('closed').next('.checkboxes');
		($.browser.msie) ? opn.show() : opn.show(150);
	});
	
	$('#categories').delegate('h2.open', 'click', function () {
		var cls = $(this).addClass('closed').removeClass('open').next('.checkboxes');
		($.browser.msie) ? cls.hide() : cls.hide(150);
	});

	/* populate directions inputs */
	$('#map-canvas').delegate('a[href$="directions-from"]', 'click', function () {
		
		setupDirectionsTab();
		
		var dra = $(this).parent('.bubble').find('.address').html();
				dra = dra.replace(/<br>/g, ' ').replace(/<BR>/g, ' ');
		var dir_latlng = $(this).parent('.bubble').attr('latlng');
		
		dir_input_from.val(dra).attr('latlng', dir_latlng);
		
		if (dir_input_to.val() === '') {
			dir_input_to.focus();
		}
		else {
			$('#get-directions').focus();
		}
		
		return false;
		
	});
	
	$('#map-canvas').delegate('a[href$="directions-to"]', 'click', function () {
		
		setupDirectionsTab();
		
		var dra = $(this).parent('.bubble').find('.address').html();
				dra = dra.replace(/<br>/g, ' ').replace(/<BR>/g, ' ');
		var dir_latlng = $(this).parent('.bubble').attr('latlng');
		
		dir_input_to.val(dra).attr('latlng', dir_latlng);
		
		if (dir_input_from.val() === '') {
			dir_input_from.focus();
		}
		else {
			$('#get-directions').focus();
		}
		
		return false;
		
	});
	
	function setupDirectionsTab() {
		$('#categories, #locations').hide();
		$('#directions').fadeIn(200);
		$('#tab-categories, #tab-locations').removeClass('active');
		$('#tab-directions').addClass('active');
	}
	
	/* clear latlng attr from directions inputs when user types custom address */
	$('#directions-from, #directions-to').keypress(function () {
		$(this).removeAttr('latlng');
	});
	
	/* set active tab */
	$('#left-column > span').click(function () {
		$('#left-column > span').removeClass('active');
		$('#left-column > div').hide();
		$(this).addClass('active');
		var tabIndex = $(this).index();
		$('#left-column > div').eq(tabIndex).fadeIn(200);
		if (tabIndex === 2) {
			$('#directions').find('input:eq(0)').focus();
		}
	});
	
	/* center map on selected location */
	$('#locations input').click(function () {
		
		latitude = $(this).attr('lat');
		longitude = $(this).attr('lon');

		map_zoom = $(this).attr('zoom');
		map_zoom = parseInt(map_zoom);

		latLng = new google.maps.LatLng(latitude, longitude);
		map.setCenter(latLng);
		map.setZoom(map_zoom);
		
	});
	
	/* draw and write directions */
	$('#get-directions').click(function () {

		var directionsService = new google.maps.DirectionsService();
		var directionsRenderer = new google.maps.DirectionsRenderer();
		
		var dir_start;
		var dir_end;
		
		if (dir_input_from.attr('latlng')) {
			dir_start = dir_input_from.attr('latlng');
		}
		else {
			dir_start = dir_input_from.val();
		}
		
		if (dir_input_to.attr('latlng')) {
			dir_end = dir_input_to.attr('latlng');
		}
		else {
			dir_end = dir_input_to.val();
		}

		directionsRenderer.setPanel(dir_results);
		directionsRenderer.setMap(map);

		var request = {
			origin: dir_start,
			destination: dir_end,
			unitSystem: google.maps.DirectionsUnitSystem.IMPERIAL,
			travelMode: google.maps.DirectionsTravelMode.DRIVING
		};

		directionsService.route(request, function (response, status) {
			if (status === google.maps.DirectionsStatus.OK) {
				directionsRenderer.setDirections(response);
			}
		});

		$('#direction-results').text('');
		$('#direction-results').show(200);
		$('#print-directions').show();

	});

	/* open print dialog */
	$('#print-directions').click(function () {
		window.print();
	});

});
