var infoBubbleInfo = {
		shadowStyle: 1,
        padding: 20,
        backgroundColor: '#F3F6FA',
        borderRadius: 10,
        arrowSize: 35,
        borderWidth: 1,
        arrowPosition: 30,
        arrowStyle: 2


};
function geoMap()
{
	var map =null;
	var markersCollections = [];
	this.makeMap = function(element,options)
	{
		map = new google.maps.Map(element,options);
		$(element).trigger('onMapSetup',[this]);
	};
	this.getMap = function()
	{
		return map;
	};
	this.addMarker = function(options)
	{
		options.map = this.getMap();
		Marker = new google.maps.Marker(options);
		return Marker;
	};
	this.addEvent = function (obj,event,callback)
	{
		return google.maps.event.addListener(obj,event,callback);
	};
	this.fitBounds = function(markersObject)
	{
		var maxLat = null;
		var minLat = null;
		var maxLng = null;
		var minLng = null;
		for(var i in markersObject)
		{
			var marker = markersObject[i];
			var latLng = marker.getPosition();
			var lat = latLng.lat();
			var lng = latLng.lng();
			if(maxLat == null || lat > maxLat)
			{
				maxLat = lat;
			}
			if(minLat == null || lat < minLat)
			{
				minLat = lat;
			}
			if(maxLng == null || lng > maxLng)
			{
				maxLng = lng;
			}
			if(minLng == null || lng < minLng)
			{
				minLng = lng;
			}
		}
		centerLat = (maxLat+minLat)/2;
		centerLng = (maxLng+minLng)/2;
		var centerLatLng = new google.maps.LatLng(centerLat,centerLng);
		var boundsNELatLng = new google.maps.LatLng(maxLat,maxLng);
		var boundsSwLatLng = new google.maps.LatLng(minLat,minLng);
		var bounds = new google.maps.LatLngBounds(boundsSwLatLng,boundsNELatLng);
		this.getMap().setCenter(centerLatLng);
		var that = this;
		var zoomEvent = this.addEvent(this.getMap(), "bounds_changed", function(){
			google.maps.event.removeListener(zoomEvent);
			if(this.getZoom() > 16)
			{
				this.setZoom(16);
			}
		})
		this.getMap().fitBounds(bounds);
		
	}
}

var GeoAddress = {
		
		getLatLng : function(address)
		{
			
		},
		getAddress : function(lat,lng)
		{
			
		}
};
function GeoMapper()
{
	this.mapObject = null;
	this.markersCollection = [];
	this.defaultMapInitOptions = function(){
		return {
					mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU}
				}
	};
	this.makeMapAndMakers = function(element,mapOptions,markers)
	{
		//don't show map if no markers.
		if(markers.length == 0)
		{
			//return ;
		}
		this.mapObject = new geoMap();
		mapOtions = $.extend(true,mapOptions,this.defaultMapInitOptions(),mapOptions);
		this.mapObject.makeMap(element,mapOptions);
		this.setMarkers(markers);
		this.setCenter();
	};
	this.setMarkers = function(markers)
	{
		for(var i in markers)
		{
			var marker = markers[i];
			this.setMarker(marker);
		}
	};
	this.setMarker = function(marker)
	{
		if(!marker.lat || !marker.lng)
		{
			if(marker.address)
			{
				//@todo address search
				//this.setMarkerAfterAddress(marker);
			}else
			{
				return ;
			}
		}
		var position = new google.maps.LatLng(marker.lat,marker.lng);
		var markerOptions = {position:position};
		if(typeof marker.constructOptions == "object")
		{
			markerOptions = $.extend(markerOptions,marker.constructOptions);
		}
		var markerObject = this.mapObject.addMarker(markerOptions);
		if(typeof InfoBubble == "function")
		{
			var bubbleOpts = {content:marker.info};
			bubbleOpts = $.extend(bubbleOpts,infoBubbleInfo);
			var infoWindow = new  InfoBubble(bubbleOpts);
		}else
		{
			var infoWindow = new  google.maps.InfoWindow({content:marker.info,maxWidth:'400px'});
		}
		this.markersCollection[marker.id] = {markerJson : marker, markerObject : markerObject};
		var mapperObject = this;
		this.mapObject.addEvent(markerObject,'click',function(){
			infoWindow.open(mapperObject.mapObject.getMap(),markerObject);
		});
		//save this click event for some use
		this.markersCollection[marker.id].infoWindow = infoWindow;
	};
	this.setCenter = function()
	{
		var markersObject = new Array;
		for(var i in this.markersCollection)
		{
			//for ingoring empty values.
			if(typeof this.markersCollection[i] != 'object')
			{
				continue;
			}
			markersObject.push(this.markersCollection[i].markerObject);
		}
		if(markersObject.length > 0)
		{
			this.mapObject.fitBounds(markersObject);
		}
	};
	this.getMarker = function(id)
	{
		var marker = null;
		if(typeof this.markersCollection[id] == "object")
		{
			marker = this.markersCollection[id];
		}
		return marker;
	}
}
/**
 * function for on hover event of title
 * @return
 */
GeoMapper.prototype.onTitleHover = function(id,close)
{
	var marker = this.getMarker(id);
	if(!marker)
	{
		return false;
	}
	var infoWindow = marker.infoWindow;
	if(close)
	{
		var fn = "close";
	}else
	{
		var fn = "open";
	}
	this.mapObject.getMap().panTo(marker.markerObject.getPosition());
	infoWindow[fn](this.mapObject.getMap(),marker.markerObject);
}
var Mapper = new GeoMapper();
(function($){
	
	$.fn.fixedDiv = function(options)
	{
		if(this.data('scrollWindowEventAdded'))
		{
			return this;
		}
		var defaultOptions = {fixAfter:null,fixTill:null,classToAdd : 'fixedDiv'};
		var msie6 = typeof $.browser.msie != "undefined" && $.browser.msie == true  && $.browser.version < 7;
		var options = $.extend(defaultOptions,options);
		if (!msie6) {
			var top = 0;
			var bottom = false;
			if(options.fixAfter)
			{
				top = $(options.fixAfter).offset().top - parseFloat($(options.fixAfter).css('margin-top').replace(/auto/, 0));
			}
			if(options.fixTill)
			{
				bottom = $(options.fixTill).offset().top + $(options.fixTill).height() - $(this).height() + parseFloat(this.css('margin-top').replace(/auto/, 0).replace('/px/i',""));
			}
			var element = this;
			var width = this.offset().left;
			this.data('scrollWindowEventAdded',true);
			$(window).scroll(function (event) {
				// what the y position of the scroll is
				var y = $(this).scrollTop();
				// whether that's below the form
				var addClass = false;
				//in %age
				if (y >= top && (bottom == false || y <= bottom)) {
					// if so, ad the fixed class
					addClass = true;
					if(element.data("noFixDiv") === true)
					{
						addClass = false;
					}
					
				} else {
					// otherwise remove it
					
				}
				if(addClass)
				{
					element.addClass(options.classToAdd);
				}else
				{
					element.removeClass(options.classToAdd);
				}
			});
		}
		return this;
	}
})(jQuery)

function makeListingMap(domId,markers,hoverEvent)
{
	Mapper = new GeoMapper();
	var mapData = markers;
	var latLng = {lat:0,lng:0};
	if(latLng)
	{
		var latlng = new google.maps.LatLng( latLng.lat,latLng.lng);
		var mapOptions = {zoom: 1,center:latlng,mapTypeId: google.maps.MapTypeId.ROADMAP};
		Mapper.makeMapAndMakers(document.getElementById(domId),mapOptions,mapData);
	}
	if(hoverEvent)
	{
		$('.listing_title a').mouseover(function(){
			doForLisitingTitleHover($(this).parent(),false);
			}).mouseout(function(){
				doForLisitingTitleHover($(this).parent(),true);
			});
	}
}

function doForLisitingTitleHover(dom,out)
{
	$this = $(dom);
	id = $this.attr('id').split('_').pop();
	Mapper.onTitleHover(id,out);
}
