var Listing = Class.create({
		  		
				initialize: function(element) 
				{
					this.element = $(element);
					this.id = this.element.readAttribute('rel');
					this.streetAddress;
					this.locality;
					this.region;
					this.postalCode;
					this.addressString = null;
					this.findAddress();
				},
				
				findAddress: function(element)
				{
				    if (this.element.down('.street-address') != undefined && this.element.down('.locality') != undefined)
				    {
				        this.streetAddress = this.element.down('.street-address').innerHTML;
    					this.locality = this.element.down('.locality').innerHTML;
    					this.region = this.element.down('.region').innerHTML;
    					this.postalCode = this.element.down('.postal-code').innerHTML;
    					this.addressString = this.streetAddress+' '+this.locality+', '+this.region+' '+this.postalCode;
				    }

				}
			}
		);


var Map = Class.create({
		  		
				initialize: function(element) 
				{
					this.container = $(element);
					
					this.listings = $H();
					this.markers = $H();
					this.getListings();
					this.loadListingsSelect();
					
					this.map = new GMap2(document.getElementById("map"));
					this.geocoder = new GClientGeocoder();
					this.loadLocation('Richmond, VA', 9);
					
					this.centerLoaded = false;
					this.initMarkerMgrExecuter = new PeriodicalExecuter(this.initMarkerMgr.bind(this), 1);
				
					this.markerMgr;
					
					this.directions = new GDirections(this.map, document.getElementById("directions"));
					this.directionsContainer;
					this.startAddress;
					this.endAddress;
										
					this.attachHandler();
					
		  		},
							
				attachHandler: function()
				{
					document.observe('click', this.eventsHandler.bind(this));
					$('directions_form').observe('submit', this.showDirections.bind(this));
					
				},
				
				initMarkerMgr: function(pe)
				{
					if (this.centerLoaded == true)
					{
						pe.stop();
						
						this.markerMgr = new MarkerManager(this.map, { trackMarkers: true });
						
						this.loadListings();
						
						this.markerMgr.refresh();
					}
				},
				
				getListings: function()
				{
					$$('.listing').each(
						function(element)
						{
							var listing = new Listing(element);
							this.listings.set(listing.id, listing);
						}.bind(this)
					);
				},
				
				loadListings: function()
				{
					this.listings.each(
						function(pair)
						{
							
							var listing = pair.value;
							//alert(listing.addressString);
						        this.geocoder.getLatLng(listing.addressString,
    									function(point) 
    									{
    										if (!point)
    										{
    											//alert("The address was not found.");
    										}
    										else 
    										{
													var marker = new GMarker(point);
    											this.markerMgr.addMarker(marker, 8, 18);
													// this.markers[listing.id] = marker;
													GEvent.addListener(marker, "click", function() {
														$$('div.listing').each(function(element) {
															$(element).removeClassName('selected');
														});
														
														$$('div[rel='+listing.id+']').first().addClassName('selected').scrollTo();
													});
    										}
    							  		}.bind(this)
    							);
						    
						}.bind(this)
					);
					
					
				},
				
				loadListingsSelect: function()
				{
					this.listings.each(
						function(pair)
						{
							var listing = pair.value;
							if (listing.addressString != null)
						    {
						        var html = '<option value="'+listing.addressString+'">'+listing.addressString+'</option>';
    							$('end_address').insert(html);
						    }
						}
					);
				},
				
				
				findAddress: function(element)
				{
				
				},
				
				
				loadLocation: function(location, zoom)
				{						
					this.geocoder.getLatLng(location,
							function(point) 
							{
								if (!point) 
								{
						  			alert("The address was not found.");
								}	 
								else 
								{
						  			this.map.setCenter(point, zoom);
									this.centerLoaded = true;
								}
					  		}.bind(this)
					);
				},
				
				showDirections: function(event)
				{
					event.stop();
				 	this.startAddress = $F('start_address');
	     			this.endAddress = $F('end_address');
	     			$('directions').show();
					this.directions.load("from: "+this.startAddress+" to: "+this.endAddress);
				},
				
				eventsHandler: function(event)
				{
					var element = $(event.target);
					
					if (element.hasClassName('directions_link'))
					{
						event.stop();
						var listingID = $(event.target).readAttribute('rel');
						var listing = this.listings.get(listingID);
						$$('#end_address option').each(
							function(option)
							{
						       	if (option.value == listing.addressString)   
								{
									$(option).writeAttribute('selected', true);
									var optionElement = $(option).clone();
									$(option).remove();
									$('end_address').insert(optionElement);
								}     
						    }.bind(this)
						);
						$('map_directions_container').scrollTo();
					}
					
				}
				
				
			});
			
Element.addMethods( 
	{
		clone: function(element) 
		{
  			var clone = new Element(element.tagName);
  			$A(element.attributes).each(
				function(attribute) 
				{ 
					if ( attribute.name != 'style' )
					{
						clone.writeAttribute(attribute.name, attribute.value);
					}
				}
			);
  			return clone.update(element.innerHTML); 
		} 		
	} 
);			
			


var Toggler = Class.create({

				initialize: function() 
				{						
					this.attachHandler();
				},
				
				attachHandler: function()
				{
					document.observe('click', this.eventHandler.bind(this));
				},
				
				eventHandler: function(event)
				{	
					if ($(event.target).hasClassName('listing_more_info_link'))
					{	
						event.stop();
						this.toggle($(event.target));
					}
					
					
				},
		
			    toggle: function(el)
				{				
					var element = el.next('div.listing_more_info');
				
					if (element.readAttribute('rel') == 0)
					{
						element.show();
						element.writeAttribute('rel', 1);
					}
					else
					{
						element.hide();
						element.writeAttribute('rel', 0);
					}

				}
				
			});


var listingMaps = $A();

document.observe('dom:loaded', 
	function(event)
	{
		//var containerToggler = new Toggler();
		var map = new Map('map_directions_container');			
	}
);
