jQuery.fn.mediaContainer = function(options) {
	$(this).each(function() {
		var mediaContainer = $(this);
		
		$(this).find('ul.MediaTabs > li > a').click(function(e) {
			e.preventDefault();
			
			var index = mediaContainer.find('ul.MediaTabs > li > a').index(this);
			mediaContainer.find('ul.MediaTabs > li > a.Current').removeClass('Current');
			mediaContainer.find('div.MediaContent > div.Content.Current').removeClass('Current');
	
			$(this).addClass('Current');
			var targetContent = $(mediaContainer.find('div.MediaContent > div.Content').get(index));
			targetContent.addClass('Current');
			
			if(targetContent.hasClass('Map')) {
				var map = targetContent.data('map');
				map.checkResize();
				map.setCenter(targetContent.data('latLng'), targetContent.data('zoomLevel'));
				targetContent.find('form > input.FromAddress:first').focus();
			}
		});
		
		$(this).find('div.MediaContent > div.Content.Images').each(function() {
			var imagesContainer = $(this);
			var preview = imagesContainer.find('div.Preview:first')
			var mediaThumbs = imagesContainer.find('div.MediaThumbs:first');
			var imageNumber = imagesContainer.find('span.CurrentImageNumber:first');

			var imagesPerPage = 5;
			var maxPage = Math.floor(mediaThumbs.find('ul > li').length / imagesPerPage);
			
			$(this).find('div.MediaThumbs > ul > li').hover(function() { 
				var thumbList = $(this).closest('ul');
				var index = thumbList.find('li').index(this);
				
				preview.find('ul:first').css('left', -(index * preview.width()));
				thumbList.find('li.Current').removeClass('Current');
				$(this).addClass('Current');
				imageNumber.html('' + (index + 1));
			});
			
			$(this).find('a.PreviousPage, a.NextPage').click(function(e) {
				e.preventDefault();
				
				var previous = $(this).hasClass('PreviousPage');
				var index = mediaThumbs.find('ul > li').index(mediaThumbs.find('ul > li.Current:first'));
				var page = Math.floor(index / imagesPerPage);
				var newPage = previous ? page - 1 : page + 1;
				if(newPage < 0 || newPage > maxPage)
					return;
				
				var newIndex = newPage * imagesPerPage;
				mediaThumbs.find('ul > li.Current').removeClass('Current');
				$(mediaThumbs.find('ul > li').get(newIndex)).addClass('Current');
				
				preview.find('ul:first').css({ left: -(newIndex * preview.width()) });

				var mediaThumbsUl = mediaThumbs.find('ul:first');
				mediaThumbsUl.animate({ left: -$(mediaThumbs.find('ul > li').get(newIndex)).position().left });
				imageNumber.html('' + (newIndex + 1));
			});
			
			$(this).find('a.Previous, a.Next').click(function(e) {
				e.preventDefault();
				
				var thumbLis = mediaThumbs.find('ul > li');
				var previous = $(this).hasClass('Previous');
				var index = thumbLis.index(mediaThumbs.find('ul > li.Current:first'));
				var newIndex = previous ? index - 1 : index + 1;
				if(newIndex < 0 || newIndex >= thumbLis.length)
					return;
				
				mediaThumbs.find('ul > li.Current').removeClass('Current');
				$(mediaThumbs.find('ul > li').get(newIndex)).addClass('Current');
				if(!mediaThumbs.find('ul > li.Current').is(':visible')) {
					if(newIndex < index)
						$(this).find('a.PreviousPage:first').click();
					else
						$(this).find('a.NextPage:first').click();
				}
				
				preview.find('ul:first').animate({ left: -(newIndex * preview.width()) });
				imageNumber.html('' + (newIndex + 1));
				
				var page = Math.floor(index / imagesPerPage);
				var newPage = Math.floor(newIndex / imagesPerPage);
				if(page != newPage) {
					var mediaThumbsUl = mediaThumbs.find('ul:first');
					var firstImageOnNewPage = (newPage > page) ? newIndex : newPage * imagesPerPage;
					mediaThumbsUl.animate({ left: -$(mediaThumbs.find('ul > li').get(firstImageOnNewPage)).position().left });
				}
			});
			
			var lightBoxSettings = {
				fixedNavigation: true,
				imageLoading: 'http://cdn.aptshowcase.madison.com/public/third-party/jquery-lightbox-0.5/images/lightbox-ico-loading.gif',
				imageBtnPrev: 'http://cdn.aptshowcase.madison.com/public/third-party/jquery-lightbox-0.5/images/lightbox-btn-prev.gif',
				imageBtnNext: 'http://cdn.aptshowcase.madison.com/public/third-party/jquery-lightbox-0.5/images/lightbox-btn-next.gif',
				imageBtnClose: 'http://cdn.aptshowcase.madison.com/public/third-party/jquery-lightbox-0.5/images/lightbox-btn-close.gif',
				imageBlank: 'http://cdn.aptshowcase.madison.com/public/third-party/jquery-lightbox-0.5/images/lightbox-blank.gif'
			};
			$(this).find('div.Preview > ul > li > a').lightBox(lightBoxSettings);
			$(this).find('div.MediaThumbs > ul > li > a').lightBox(lightBoxSettings);
		});

		var latitude = mediaContainer.data('latitude');
		var longitude = mediaContainer.data('longitude');
		if(latitude !== undefined || longitude !== undefined) {
			var latLng = new GLatLng(latitude, longitude);
			var zoomLevel = 13;

			$(this).find('div.MediaContent > div.Content.Map').each(function() {
				var map = new GMap2($(this).find('div.MapContainer:first').get(0));
				map.setCenter(latLng, zoomLevel);
				var options = map.getDefaultUI();
				options.zoom.scrollwheel = false;
				map.setUI(options);
				map.checkResize();
	
				$(this).data('map', map);
				$(this).data('latLng', latLng);
				$(this).data('zoomLevel', zoomLevel);
				
				map.addOverlay(new GMarker(latLng, { title: mediaContainer.data('title') }));
				
				$(this).find('div.DirectionsForm > form').submit(function(e) {
					e.preventDefault();
					
					window.open($(this).attr('action') + '?' + $(this).serialize()); 
				});
				
				$(this).find('div.DirectionsForm > form > a.Submit').click(function(e) {
					e.preventDefault();
					
					$(this).closest('form').submit();
				});
			});

			var enableStreetView = function(streetViewContent, enabled) {
				var index = mediaContainer.find('div.MediaContent > div.Content').index(streetViewContent);
				var streetViewTab = $(mediaContainer.find('ul.MediaTabs > li').get(index));
				
				if(enabled) {
					streetViewTab.show();
				} else {
					streetViewContent.remove();
					streetViewTab.remove();
				}
			};
			$(this).find('div.MediaContent > div.Content.StreetView').each(function() {
				var streetViewContent = $(this);
				var client = new GStreetviewClient();
				client.getNearestPanoramaLatLng(latLng, function(latLng) {
					if(latLng == null) {
						enableStreetView(streetViewContent, false);
						return;
					}

					var panorama = new GStreetviewPanorama($(streetViewContent).get(0), { latlng: latLng });
					GEvent.addListener(panorama, "error", function(errorCode) {
						if(errorCode == 603) {
							enableStreetView(streetViewContent, false);
							return;
					  	}
					});

					$(this).data('panorama', panorama);
					enableStreetView(streetViewContent, true);
				});
			});
		}
	});
};

