/**jQuery.ScrollTo - Easy element scrolling using jQuery.
 * Copyright 2007-2008 Ariel Flesler http://flesler.blogspot.com Dual licensed under MIT and GPL.
 * @author Ariel Flesler  http://flesler.blogspot.com/2007/10/jqueryscrollto.html
 * @version 1.4 Date: 9/11/2008
 */
;(function(h){var m=h.scrollTo=function(b,c,g){h(window).scrollTo(b,c,g)};m.defaults={axis:'y',duration:1};m.window=function(b){return h(window).scrollable()};h.fn.scrollable=function(){return this.map(function(){var b=this.parentWindow||this.defaultView,c=this.nodeName=='#document'?b.frameElement||b:this,g=c.contentDocument||(c.contentWindow||c).document,i=c.setInterval;return c.nodeName=='IFRAME'||i&&h.browser.safari?g.body:i?g.documentElement:this})};h.fn.scrollTo=function(r,j,a){if(typeof j=='object'){a=j;j=0}if(typeof a=='function')a={onAfter:a};a=h.extend({},m.defaults,a);j=j||a.speed||a.duration;a.queue=a.queue&&a.axis.length>1;if(a.queue)j/=2;a.offset=n(a.offset);a.over=n(a.over);return this.scrollable().each(function(){var k=this,o=h(k),d=r,l,e={},p=o.is('html,body');switch(typeof d){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(d)){d=n(d);break}d=h(d,this);case'object':if(d.is||d.style)l=(d=h(d)).offset()}h.each(a.axis.split(''),function(b,c){var g=c=='x'?'Left':'Top',i=g.toLowerCase(),f='scroll'+g,s=k[f],t=c=='x'?'Width':'Height',v=t.toLowerCase();if(l){e[f]=l[i]+(p?0:s-o.offset()[i]);if(a.margin){e[f]-=parseInt(d.css('margin'+g))||0;e[f]-=parseInt(d.css('border'+g+'Width'))||0}e[f]+=a.offset[i]||0;if(a.over[i])e[f]+=d[v]()*a.over[i]}else e[f]=d[i];if(/^\d+$/.test(e[f]))e[f]=e[f]<=0?0:Math.min(e[f],u(t));if(!b&&a.queue){if(s!=e[f])q(a.onAfterFirst);delete e[f]}});q(a.onAfter);function q(b){o.animate(e,j,a.easing,b&&function(){b.call(this,r,a)})};function u(b){var c='scroll'+b,g=k.ownerDocument;return p?Math.max(g.documentElement[c],g.body[c]):k[c]}}).end()};function n(b){return typeof b=='object'?b:{top:b,left:b}}})(jQuery);

/**
 * @author Marco Alionso Ramirez, marco@onemarco.com
 * @url http://onemarco.com
 * This code is public domain
 */
var MapIDandInnerIDPrefix = 'PropertyMap';
function init_property_maps () {
	var SiteDomain				= '';
	var AgentID					= '';
	var MapID 					= '#'+MapIDandInnerIDPrefix;
	var MapListID 				= MapID+'List';
	var MapDetailedViewID 		= MapID+'DetailedViewWrapper';
	var MapControlsID 			= MapID+'Controls';
	var MapDetailedViewContentID = MapID+'DetailedViewContent';
	var MapSearchFormID 		= MapID+'SearchForm';
	var MapLegendID 			= MapID+'Legend';
	var MapMessageID 			= MapID+'Message';
	var MapTooltipClass 		= '.'+MapIDandInnerIDPrefix+'Tooltip';
	var MapDetailedViewTimer	= 0;
	var MapListTimers 			= new Array();
	
	function getQuerystringVar ( name ) {
		name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
		var regexS = "[\\?&]"+name+"=([^&#]*)";
		var regex = new RegExp( regexS );
		var results = regex.exec( window.location.href );
		if( results == null )
			return "";
		else
			return results[1];
	}
	if (getQuerystringVar('domain') != '')
		SiteDomain = 'http://' + getQuerystringVar('domain');
	if (getQuerystringVar('agent_id') != '')
		AgentID = '&amp;agent_id=' + getQuerystringVar('agent_id');
	
	/**
	 * The Tooltip class is an addon designed for the Google Maps google.maps.Marker class.
	 * @constructor
	 * @param {google.maps.Marker} marker
	 * @param {String} text
	 * @param {Number} padding
	 */
	function GMapTooltip(marker, content, padding) {
		this._marker = marker;
		this._content = content;
		this._padding = padding;
	}
	
	GMapTooltip.prototype = new google.maps.Overlay();
	
	GMapTooltip.prototype.initialize = function (map) {
		var $div = $("<div></div>").css({'cursor':'pointer'});
		$div
			.addClass(MapIDandInnerIDPrefix+'Tooltip')
			.css({'position':'absolute' ,'visibility':'hidden'})
			.append(this._content);
		$(map.getPane(G_MAP_FLOAT_PANE)).append($div);
		this._map = map;
		this.$div = $div;
	}
	
	GMapTooltip.prototype.remove = function() {
		this.$div.remove();
	}
	
	GMapTooltip.prototype.copy = function(){
		return new GMapTooltip(this._marker,this._content,this._padding);
	}
	
	GMapTooltip.prototype.redraw = function (force) {
		if (!force) return;
		var markerPos = this._map.fromLatLngToDivPixel(this._marker.getLatLng());
		var iconAnchor = this._marker.getIcon().iconAnchor;
		var xPos = Math.round(markerPos.x - this.$div.width() / 2);
		var yPos = markerPos.y - iconAnchor.y - this.$div.height() - this._padding - 10;
		this.$div.css({
			'top': yPos + 'px',
			'left': xPos + 'px'
		});
	}
	
	GMapTooltip.prototype.show = function() {
		this.$div.css({'visibility':'visible'});
	}
	
	GMapTooltip.prototype.hide = function(){
		this.$div.css({'visibility':'hidden'});
	}
	
	
	/**
	 * @author Marco Alionso Ramirez, marco@onemarco.com
	 * @url http://onemarco.com
	 * This code is public domain
	 */
	
	//load and unload the map
	$(function(){
		if(google.maps.BrowserIsCompatible()){
			createMap();
		}else{
			// tell them somehow
		}
	});
	$(window).unload(function(){
		google.maps.Unload();
	});
	
	
	//create map icon and sidebar
	function createMap(){
		var map = new google.maps.Map2( $( MapID )[0] );
		var mapCenter = {};
		mapCenter.lat = 38.62774;
		mapCenter.lng = -90.199514;
		var PropertyMapData =  $( MapID ).data('PropertyMapData');
		if(PropertyMapData){
			var searchCenter = PropertyMapData.mapCenter; // PropertyMapData.mapCenter = search center
			var mapCenter = searchCenter; // PropertyMapData.mapCenter = search center
			var properties = PropertyMapData.properties;
		}
		map.setCenter(new google.maps.LatLng(mapCenter.lat, mapCenter.lng), 15 );
		map.addControl(new google.maps.MapTypeControl());
		map.addControl(new google.maps.LargeMapControl());
		
		var icon = new google.maps.Icon();
		icon.image = "/images/maps/prudential.png";
		icon.shadow = "/images/maps/prudential_shadow.png";
		icon.iconSize = new google.maps.Size(20, 26);
		icon.shadowSize = new google.maps.Size(30, 27);
		icon.iconAnchor = new google.maps.Point(10, 25);
		icon.infoWindowAnchor = new google.maps.Point(10, 0);
		icon.infoShadowAnchor = new google.maps.Point(23, 13);
		
		if(MapListTimers)
			while(MapListTimers.length > 0)
				clearTimeout(MapListTimers.pop());
		var content = {};
		var thumb = new Image();
		var markers = new Array();
		var markerPoints = new Array();
		var propertiesArray = new Array();
		if(properties){
			if(properties.length > 0){
				propertiesArray = $.makeArray(properties);
				markerPoints.push(map.fromLatLngToContainerPixel(new google.maps.LatLng(mapCenter.lat, mapCenter.lng)));
				for(el in propertiesArray)
					markerPoints.push(map.fromLatLngToContainerPixel(new google.maps.LatLng(propertiesArray[el].lat, propertiesArray[el].lng)));
				var markerBounds = new google.maps.Bounds(markerPoints);
				var mapLatLngBounds = map.getBounds();
				var markerLatLngBounds = new google.maps.LatLngBounds( map.fromContainerPixelToLatLng(markerBounds.min()), map.fromContainerPixelToLatLng( markerBounds.max()) );
				map.setCenter(markerLatLngBounds.getCenter(),map.getBoundsZoomLevel(markerLatLngBounds));
				map.savePosition();
				function addProperty(i,property){
					thumb.src = property.image_thumb;
					$tooltipContent = $('<div>' + 
									'<img class="thumb" src="' + property.image_thumb + '" />' +
									'<div class="description">' + 
										property.address + 
										'<br/>(' + property.price + ')' +
									'</div>' + 
									'<small class="clear">(double-click for property details)</small>' +
								'</div>');
					$listItemContent = $('<table>' + 
											'<tr>' + 
												'<td class="image">' + 
													'<img class="thumb" src="' + property.image_thumb + '" />' +
													'<small class="moreInfo"><a href="#MoreInfo"><nobr>more info</nobr></a></small>' +
												'</td>' +
												'<td class="description">' + 
													property.address + 
													'<br/>(' + property.price + ')' +
												'</td>' +
											'</tr>' + 
										'</table>');
					var marker = new google.maps.Marker(new google.maps.LatLng(property.lat, property.lng),{icon:icon});
					marker.PropertyMapData = property;
					markers.push( createMarker(marker,$listItemContent,$tooltipContent,map) );
				}
				$(MapListID).find('li .moreInfo a').die('click').live('click',function(e){
					e.preventDefault();
					google.maps.Event.trigger($(this).closest('li')[0],'dblclick');	
				});
				$(MapListID).html(''); // clear the list
				MapListTimers = chunk(propertiesArray,addProperty);
			}else{
				$( MapListID ).html('<li class="error">No properties found for those search parameters. Please modify your search and try again.</li>');
			}
			if(properties.length == 100)
				$(MapMessageID).html('* Your search results exceed 100 property listings. Please refine your search to narrow the results. *').slideDown(1000);
			else
				$(MapMessageID).slideUp(1000,function(){$(this).html('');});
		}
		var search_icon = new google.maps.Icon(G_DEFAULT_ICON);
		//var letter = String.fromCharCode("X".charCodeAt(0));
		//search_icon.image = "http://www.google.com/mapfiles/marker" + letter + ".png";
		var search_marker = new google.maps.Marker(new google.maps.LatLng(mapCenter.lat, mapCenter.lng),{icon:search_icon,title:'Search Center'});
		map.addOverlay(search_marker);
		resizePropertyMap();
		return markers;
	}
	
	function createStreetViewCallback(latlng){
		var container = document.getElementById("PropertyMapStreetView");
		var StreetviewPanorama = $(container).data('StreetviewPanorama');
		if(StreetviewPanorama) { StreetviewPanorama.remove(); }
		if(latlng){
			$(container).show().data('StreetviewPanorama', new google.maps.StreetviewPanorama(container,{'latlng':latlng}) );
			return true;
		}else{
			$(container).hide();
			return false;
		}
	}
	
	function createStreetView(latlng){
		var StreetviewClient = new google.maps.StreetviewClient();
		StreetviewClient.getNearestPanoramaLatLng(latlng,createStreetViewCallback);
	}
	
	//create the marker
	function createMarker(marker,listItemContent,tooltipContent,map){
		
		marker.GMapTooltip = new GMapTooltip(marker,tooltipContent,5);
		createTab(marker,tooltipContent);
		marker.isInfoWindowOpen = false;
		var listItemIdNum = $( MapListID ).find('li').length+1;
		var listItemId = MapID.substring(1)+'List_'+listItemIdNum;
		var listItem = $('<li></li>').html(listItemContent).css({'list-style':'none'}).attr('id',listItemId).attr('tabIndex',listItemIdNum);
		$(MapListID).append(listItem);
		$('#'+listItemId)
			.bind('mouseover focus',function(){
				$(this).addClass('hover');
			})
			.bind('mouseout blur',function(){
				$(this).removeClass('hover');
			})
			.bind('keypress',function(e){
				if (e.keyCode == 13 || e.which == 13) {
					e.preventDefault();
					markerDoubleClick.call(marker);
				}else if (e.keyCode == 32 || e.which == 32) {
					e.preventDefault();
					markerClick.call(marker);
				}
			});
		if(listItemIdNum == 1)
			listItem.focus();
		marker.listItem = listItem[0];
		
		var ttmover = google.maps.Event.callbackArgs(marker,tooltipMouseover);
		var ttmout = google.maps.Event.callbackArgs(marker,tooltipMouseout);
		var mclick = google.maps.Event.callback(marker,markerClick);
		var mdblclick = google.maps.Event.callback(marker,markerDoubleClick);
		
		google.maps.Event.addDomListener(marker.GMapTooltip._content[0],'mouseover',ttmover);
		google.maps.Event.addDomListener(marker.GMapTooltip._content[0],'mouseout',ttmout);
		google.maps.Event.addDomListener(marker.GMapTooltip._content[0],'click',mclick);
		google.maps.Event.addDomListener(marker.GMapTooltip._content[0],'dblclick',mdblclick);
		google.maps.Event.addDomListener(marker.listItem,'mouseover',ttmover);
		google.maps.Event.addDomListener(marker.listItem,'focus',ttmover);
		google.maps.Event.addDomListener(marker.listItem,'mouseout',ttmout);
		google.maps.Event.addDomListener(marker.listItem,'blur',ttmout);
		google.maps.Event.addDomListener(marker.listItem,'click',mclick);
		google.maps.Event.addDomListener(marker.listItem,'dblclick',mdblclick);	
		google.maps.Event.addListener(marker,'mouseover',ttmover);
		google.maps.Event.addListener(marker,'mouseout',ttmout);
		google.maps.Event.addListener(marker,'click',mclick);
		google.maps.Event.addListener(marker,'dblclick',mdblclick);
		
		map.addOverlay(marker);	
		map.addOverlay(marker.GMapTooltip);
		
		return marker;
	}
	
	//create the tab(s) for the google.maps.InfoWindow
	function createTab(marker,content){
		// var element = $('<div class="googleMarkerTab"></div>').append($('<div class="content"></div>').append(content))[0];
		// marker.tab = [new google.maps.InfoWindowTab('Address',element)];
	}
	
	//makrer,sidebar mouseover handler
	function tooltipMouseover(){
		if( !(this.isInfoWindowOpen) && !(this.isHidden()) ){
			this.originalIconImage = this.getIcon().image;
			this.setImage('/images/maps/prudential-black.png');
			$(this.listItem).addClass('current');
			if($(this.GMapTooltip).data('hoverTimer'))
				clearTimeout($(this.GMapTooltip).data('hoverTimer'));
			$(MapTooltipClass).css({'z-index':5});
			this.GMapTooltip.show();
			this.GMapTooltip.$div.css({'z-index':10});
		}
	}
	
	//marker,sidebar mouseout handler
	function tooltipMouseout(){
		if(this.originalIconImage)
			this.setImage(this.originalIconImage);
		else
			this.setImage('/images/maps/prudential.png');
		$(this.listItem).removeClass('current');
		var GMapTooltip = this.GMapTooltip;
		var hideTooltip = function() {
			GMapTooltip.hide();
		}
		$(GMapTooltip).data('hoverTimer',setTimeout(hideTooltip,125));
	}
	
	//marker click handler
	function markerClick(){
		$(MapControlsID).find('.close').click();
		if($(this.listItem).hasClass('hover')){
			this.GMapTooltip._map.panTo(this.getLatLng());
		} else {
			$(MapListID).stop().scrollTo(this.listItem,800,{queue:'elasout'});
			$(this.listItem).focus();
		}
		// this.GMapTooltip._map.savePosition();
		// this.openInfoWindowTabs(this.tab);
	}
	
	//marker click handler
	function markerDoubleClick(){
		this.GMapTooltip.hide();
		$(window).stop().scrollTo($(MapID).parent(),500);
		if($(this.listItem).hasClass('hover'))
			this.GMapTooltip._map.panTo(this.getLatLng());
		else
			$(MapListID).stop().scrollTo(this.listItem,800);
		var property = this.PropertyMapData;
		if(pageTracker){
			// Google Analytics
			pageTracker._trackPageview("/search/map_property_details.html?mls="+property.mls);
		}
		var deatailedViewTemplate = '<table>' +
						'<tr>' +
							'<td class="mainImage">';
							
		if(property.images.length > 1){
			var scroll = property.images.length > 6 ? ' scroll ':'';
			deatailedViewTemplate += '<p class="thumbs'+scroll+'">';
			for(imageKey in property.images)
				deatailedViewTemplate += '<img src="'+property.images[imageKey].replace('medium','small')+'" alt=""/>';
			deatailedViewTemplate += '</p>';
		}
								
								
		deatailedViewTemplate = deatailedViewTemplate + 
								'<img class="mainImage" src="'+ property.images[0] +'" alt="" />' +
							'</td>' +
							'<td>' +
								'<table>' +
								'	<tbody>' +
								'		<tr>' +
								'			<th>Listed At</th><td>' + property.price + '</td>' +
								'		</tr>' +
								'		<tr>' +
								'			<th>Distance From<br/>Search Center</th><td>' + property.distance + ' miles</td>' +
								'		</tr>' +
								'		<tr>' +
								'			<th>Address</th><td class="nowrap">' + property.address + '</td>' +
								'		</tr>';
								
		if(property.county && property.county.length > 0){
			deatailedViewTemplate = deatailedViewTemplate +  
								'		<tr>' +
								'			<th>County</th><td>' + property.county + '</td>' +
								'		</tr>';
		}
		
		if(property.school_district && property.school_district.length > 0){
			deatailedViewTemplate = deatailedViewTemplate + 
								'		<tr>' +
								'			<th>School District</th><td>' + property.school_district + '</td>' +
								'		</tr>' +
								'		<tr>';
		}
		
		if(property.beds && property.beds > 0){
			deatailedViewTemplate = deatailedViewTemplate +
								'			<th>Beds</th><td>' + property.beds + '</td>' +
								'		</tr>' +
								'		<tr>';
		}
		
		if(property.baths && property.baths > 0){
			deatailedViewTemplate = deatailedViewTemplate +
								'			<th>Baths</th><td>' + property.baths + '</td>' +
								'		</tr>';
		}
		
		if(property.square_feet && property.square_feet > 0){
			deatailedViewTemplate = deatailedViewTemplate +
								'		<tr>' +
								'			<th>Square Footage</th><td>' + property.square_feet + ' ft<sup>2</sup></td>' +
								'		</tr>';
		}
		
		deatailedViewTemplate = deatailedViewTemplate +  
								'		<tr>' +
								'			<td class="moreInfo" colspan="2"><a href="' + SiteDomain + '/search/view_listing.html?mls=' + property.mls + AgentID + '">View Property Page &raquo;</a></td>' +
								'		</tr>' +
								'	</tbody>' +
								'</table>' +
							'</td>' +
							'<td>' +
								'<span class="viewListingActionButtons">' +
									'<a class="buttonBorderless small thickbox" href="' + SiteDomain + '/contact_agent.html?mls_id=' + property.mls + AgentID +  '&amp;TB_iframe=true&amp;width=460&amp;height=550">Contact An Agent!<span/></a><br/>' +
									'<a class="buttonBorderless small blue" href="' + SiteDomain + '/save_search/index.html?action=addtofavorites&amp;mls_id=' + property.mls + AgentID +  '&amp;type=cnd">Add To Favorites<span/></a><br/>' +
									'<a class="buttonBorderless small blue" href="' + SiteDomain + '/search/email_to_friend.html?mls=' + property.mls + AgentID +  '">Email To A Friend<span/></a><br/>' +
								'</span>' +
							'</td>' +
						'</tr>' +
					'</table>';
					
		$(MapDetailedViewID)
			.find(MapDetailedViewContentID)
				.html($(deatailedViewTemplate))
			.end()
			.height( $(MapID).height() )
			.show();
		createStreetView(this.getLatLng());
		
		$('.mainImage .thumbs img').unbind('click').bind('click',function(e){
			$('td.mainImage img.mainImage').attr('src',$(this).attr('src').replace('small','medium'));
		});
		if(SiteDomain.length > 1 && AgentID.length == 0){
			$(MapDetailedViewContentID).find('.viewListingActionButtons a:not(.thickbox), .moreInfo a').unbind('click').bind('click',function(e){
				e.preventDefault();
				parent.location = $(this).attr('href');
			});
		}
		
		$('#PropertyMapDetailedView a.thickbox').unbind('click').bind('click',function(e){
			e.preventDefault();
			// thickbox
			var t = this.title || this.name || null;
			var a = this.href || this.alt;
			var g = this.rel || false;
			tb_show(t,a,g);
			this.blur();
		});
		
		if($.browser.msie && $.browser.version < 7) {
			var mapWrapperLeftOffset = $('#PropertyMapWrapper').offset().left;
			var detailWrapperLeftOffset = $('#PropertyMapDetailedViewWrapper').offset().left;
			if(detailWrapperLeftOffset > mapWrapperLeftOffset)
				$('#PropertyMapDetailedViewWrapper').css({'left':mapWrapperLeftOffset - detailWrapperLeftOffset}).bgIframe();
		}
		$('#PropertyMapDetailedViewWrapper').css({'z-index':999});
		
		// this.GMapTooltip._map.savePosition();
		// this.openInfoWindowTabs(this.tab);
	}
	
	var $MapDetailedViewID = $(MapDetailedViewID);
	if($MapDetailedViewID.length > 0){
		if($.browser.msie && $.browser.version < 7)
			$(MapDetailedViewContentID).bgiframe();
		$(document).bind('keypress',function(e){
			if($MapDetailedViewID.is(':visible') && e.keyCode == 27){
				$MapDetailedViewID.hide().find(MapDetailedViewContentID).html('');
			}
		});
		$(MapControlsID).find('.close').click(function(e){
			e.preventDefault();
			$MapDetailedViewID.hide().find(MapDetailedViewContentID).html('');
		});
	}
	
	//infowindowopen handler
	function infoWindowOpen(){
		this.isInfoWindowOpen = true;	
	}
	
	//infowindowclose handler
	function infoWindowClose(){
		this.isInfoWindowOpen = false;
	}
			
	$(MapID).bind('PropertyMapDataChanged', function(){
		createMap();
	});
	
	function resizePropertyMap(){
		if($(MapListID).is(':visible')){
			var newHeight = $(window).height()/2;
			if(newHeight < 300){
				$(MapID).height(300);
				newHeight = $(window).height() - 300;
			}else{
				$(MapID).height(newHeight);
			}
			newHeight = newHeight - $(MapLegendID).height() - $(MapSearchFormID).height() - 40;
			if(newHeight < 135)
				newHeight = 135;
			$(MapListID).height(newHeight);
			$(window).stop().scrollTo($(MapID).parent());
		}
	}
	
	$(window).resize(resizePropertyMap);
	
	$(MapSearchFormID).submit(function(e){
		e.preventDefault();
		var serializedForm = $(MapSearchFormID).serialize();
		if (pageTracker) {
			pageTracker._trackPageview("/search/map_search.html?"+serializedForm);
		}
		$(MapControlsID).find('.close').click();
		$(MapLegendID).add(MapListID).slideDown();
		resizePropertyMap();
		$(window).stop().scrollTo($(MapID).parent(),800);
		$( MapListID ).html('<li class="loader"><img src="/images/icons/loading.gif" /></li>');
		$.ajax({
			type: "POST",
			url: "/jqueryAjax/getMapResults.php",
			data: serializedForm,
			dataType: 'json',
			success: function(data, status){
				$(MapID).data('PropertyMapData',data).trigger('PropertyMapDataChanged');
			}
		 });
	});
}

google.load("maps", "2");
google.setOnLoadCallback(init_property_maps);