var markerList;var map;var defaultCenter=[22.546171,114.032421,10];var zoom;var map_icon_path="./images/Map/";var mapdiv;
var mapdivid;var mapProjection=[];var markersArray = [];var geocoder;
var GMarker,GEvent,GLatLng,MyMapOverLay;
var hideDelay = 500;    var hideDelayTimer = null; 
var onpop = false; 
var markon = false;
var popup;
function initmap(options,shoplist)
{
	GMarker=google.maps.Marker;
	GEvent=google.maps.event;
	GLatLng=google.maps.LatLng;
	MyMapOverlay=function(mapview){if(mapview==0){this.setMap(map);}else{this.setMap(map.getStreetView());}};MyMapOverlay.prototype=new google.maps.OverlayView;MyMapOverlay.prototype.constructor=MyMapOverlay;MyMapOverlay.prototype.onAdd=function(){}
MyMapOverlay.prototype.onRemove=function(){}
MyMapOverlay.prototype.draw=function(){}
	markerList = shoplist;
	mapdiv = document.getElementById(options.mapid);
	mapdivid = options.mapid;
	if(!mapdiv) return;
	var myOptions={mapTypeId:google.maps.MapTypeId.ROADMAP,navigationControl:true,mapTypeControl:true,scrollwheel:true,scaleControl:true};
	map = new google.maps.Map(mapdiv, myOptions);

	for(var i=markerList.length-1;i>=0;i--){if(markerList[i]['lat'])break;}	
	if(markerList.length>1)
	{
		var maxLat=0.0;var maxLng=0.0;var minLat=500.0;var minLng=500.0;
		for(var i=markerList.length-1;i>=0;i--)
		{
			if(markerList[i]["lat"]>0&&markerList[i]["lng"]>0)
			{
				maxLat=Math.max(maxLat,markerList[i]["lat"]);
				maxLng=Math.max(maxLng,markerList[i]["lng"]);
				minLat=Math.min(minLat,markerList[i]["lat"]);
				minLng=Math.min(minLng,markerList[i]["lng"]);
			}
		}
		x=minLat+(maxLat-minLat)/2;
		y=minLng+(maxLng-minLng)/2;
		map.fitBounds(new google.maps.LatLngBounds(new GLatLng(minLat,minLng),new GLatLng(maxLat,maxLng)));
		//z=Math.min(z,18);
	}else if(markerList.length==1)
	{
		x=markerList[0]["lat"];
		y=markerList[0]["lng"];
		z=15;
	}else
	{
		z=defaultCenter[2];
		x=defaultCenter[0];
		y=defaultCenter[1];
	}
	if(markerList.length<=1){
	map.setCenter(new google.maps.LatLng(x,y));
	map.setZoom(z);
	}
	if(options.autofresh)
	{
		GEvent.addListener(map,"dragend",function(){showNearBy('',1);});
		GEvent.addListener(map,"zoom_changed",function(){showNearBy('',1);});
	}
	if(options.type)
	{
		var markeroptions = {type:options.type};
	}else
	{
		var markeroptions = {type:99};
	}
	if(markerList.length>0){
		showAllMarkers(markerList,markeroptions);
	}
	if(options.shownearby)
	{
		setTimeout('showNearBy(0,0)',6000);
	}
	
}

function clearOverlays() {
  if (markersArray) {
    for (i in markersArray) {
      markersArray[i].setMap(null);
    }
  }
}

function showNearBy(id,is_reset)
{
	if(is_reset)
	{
		clearOverlays();
		showAllMarkers(markerList,{type:99});
	}
	var cuisine_id = $('#cuisine_id').val();
	var dish_id = $('#dish_id').val();
	var amenity_id = $('#amenity_id').val();
	var consume_id = $('#consume_id').val();
	var rname = $('#rname').val();
	var param = {act:"map"};
	var ajaxurl = "act=map";
	if(cuisine_id)
	{
		ajaxurl+="&cuisine_id="+cuisine_id;
	}
	if(dish_id)
	{
		ajaxurl += "&dish_id="+dish_id;
	}
	if(amenity_id)
	{
		ajaxurl += "&amenity_id="+amenity_id;
	}
	if(consume_id)
	{
		ajaxurl += "&consume_id="+consume_id;
	}
	if(rname)
	{
		ajaxurl += "&rname="+rname;
	}
	var bounds=map.getBounds();
	var xy=map.getCenter();
	var z=map.getZoom();
	var sw =bounds.getSouthWest();
	var ne = bounds.getNorthEast();
	ajaxurl += "&sx="+sw.lat();ajaxurl += "&bx="+ne.lat(); ajaxurl += "&sy="+sw.lng(); ajaxurl += "&by="+ne.lng();
	$.ajax({type:'GET',cache:false,url:'./load.php',dataType:"json",data:ajaxurl,success:function(data){																					
	    var count = data.length;
		var total = data[0].total;
		var url ="";
		if(count!=0)
		{
			url = "sr_search_result.php?cuisine_id="+cuisine_id+"&dish_id="+dish_id+"&amenity_id="+amenity_id+"&consume_id="+consume_id+"&sx="+sw.lat()+"&bx="+ne.lat()+"&sy="+sw.lng()+"&by="+ne.lng();
		}
		var markeroptions = {type:1};
		showAllMarkers(data,markeroptions);
		showMsg(count,total,url);
		}
	});
}

function showAllMarkers(data,markeroptions)
{
	var AllMarkers={};
	var getcs=function(lat,lng)
	{
		return''+Math.round(lat*32768)+Math.round(lng*32768);
	}
	for(var i=0;i<data.length;i++)
	{
		
		if(markerList[data[i].id]) continue;
		if(data[i]['lat']>0&&data[i]['lng']>0)
		{
			var xy=getcs(data[i]['lat'],data[i]['lng']);
			if(AllMarkers[xy])
			{
				AllMarkers[xy].push(data[i]);
			}else{
				AllMarkers[xy]=[data[i]];
			}
		}
	}
	for(var i in AllMarkers)
	{
		updateMarker(AllMarkers[i],markeroptions);
	}
}

function updateMarker(markers,markeroptions)
{

	var point = new google.maps.LatLng(markers[0]['lat'],markers[0]['lng']);
	var marker = createMarker(markers,point,markeroptions);
	markersArray.push(marker);
	
}

function createMarker(markers,point,markeroptions)
{
	var MapIcon;
	if(markeroptions.type==1)
	{
		if(markers.length==1)
		{
			 MapIcon = new google.maps.MarkerImage(map_icon_path+"GoogleMap_icon_s.png",
			  new google.maps.Size(22, 23),
			  new google.maps.Point(0,0),
			  new google.maps.Point(0, 23));
		}else{
			MapIcon = new google.maps.MarkerImage(map_icon_path+"GoogleMap_icon_more_s.png",
			  new google.maps.Size(22, 23),
			  new google.maps.Point(0,0),
			  new google.maps.Point(0, 23));
		}
	}else if(markeroptions.type==2)
	{
		if(markers.length==1)
		{
			MapIcon = new google.maps.MarkerImage(map_icon_path+markers[0].label+".png",
			  new google.maps.Size(30, 31),
			  new google.maps.Point(0,0),
			  new google.maps.Point(0, 31));
		}else{
			MapIcon = new google.maps.MarkerImage(map_icon_path+"GoogleMap_icon_more.png",
			  new google.maps.Size(30, 31),
			  new google.maps.Point(0,0),
			  new google.maps.Point(0, 31));
		}
	}else
	{
		if(markers.length==1)
		{
			MapIcon = new google.maps.MarkerImage(map_icon_path+"GoogleMap_icon.png",
			  new google.maps.Size(40, 40),
			  new google.maps.Point(0,0),
			  new google.maps.Point(0, 40));
		}else{
			MapIcon = new google.maps.MarkerImage(map_icon_path+"GoogleMap_icon_more.png",
			  new google.maps.Size(40, 40),
			  new google.maps.Point(0,0),
			  new google.maps.Point(0, 40));
		}
	}
	var markerOpt={icon:MapIcon};
	if(markers.length>1)
	{
		markerOpt.title='此地點共有'+markers.length+'間餐廳。';
	}else{
		markerOpt.title=markers[0].name;
	}
	markerOpt.map=map;
	markerOpt.position=point;
	var marker=new GMarker(markerOpt);
	var html = '';
	if(markers.length>1)
	{
		html += markerOpt.title;
	}
	if(markers.length>2) html += '<div class="mappopup_multi" id="mappopup_multi">';
	for(var i=0;i<markers.length;i++)
	{
		if(i>0)
		{
			html += '<div class="clr"></div>';
		}
		html += '<div class="map_Rs">';
	    var sr_icon = '';
		if(markeroptions.type==2) 
		{
			sr_icon = '<img align="absmiddle" src="'+map_icon_path+'bullet/'+markers[i].label+'.gif" />';
		}
		html += '<div class="mapRsphoto"><img src="'+markers[i].photo+'" width="150" height="100" border="0" /></div>';
		html += '<div class="mapRsinfo"><span>'+sr_icon+'<a href="'+markers[i].url+'" target="_blank" class="mapRsTitle">'+markers[i].name+'</a></span><br />地址 : '+markers[i].addr;
		if(markers[i].phone!='')
		{
			html += '<br />電話 : '+markers[i].phone;
		}
		html += '<br />類別 : '+markers[i].categories;
		html += '<br /><strong>'+markers[i].smile+'</strong> <img src="./images/good.gif"  height="16" align="absmiddle" /> vs <strong>'+markers[i].cry+'</strong> <img src="./images/bad.gif" align="absmiddle" />';
		html += '<a href="'+markers[i].url+'" target="_blank" >查看详情</a></div>';
		html += '</div>';
	}
	if(markers.length>2)
	{
		html += '</div>';
	}
	
	GEvent.addListener(marker,"mouseover",function(){showInfo(html,point);});

	GEvent.addListener(marker,"mouseout",function(){hideInfo();});

    return marker;
}

function getCurrentMapView(){return map.getStreetView().getVisible()?1:0;}
function getMapProjection(mapview){mapview=mapview||0;if(!mapProjection[mapview]){var overlay=new MyMapOverlay(mapview);mapProjection[mapview]=overlay.getProjection();}
return mapProjection[mapview];}

function showInfo(Rshtml,point)
{
	onpop = false;
	if(popup) popup.remove();
	var mousePos = getElementPos(mapdivid);
	var mapview=getCurrentMapView();
	var markerPos=getMapProjection(mapview).fromLatLngToContainerPixel(point);
	//var markerPos=map.fromLatLngToContainerPixel(point);
	var DivLeft = mousePos.x+markerPos.x-200+'px';
	var DivTop	= mousePos.y+markerPos.y-145+'px';
	var CornerCss = 'CornerRight';
	var cornerImage = 'cornerLeft.gif';

	var html ='<div style="position:absolute;top:'+DivTop+';left:'+DivLeft+';height:auto;z-index:9999;" id="maprsinfo"></div>';
	$(html).appendTo(document.body);
	var thehtml = '<div class="mapContent" id="infoContent">'+Rshtml+'</div>';
	$('#maprsinfo').html(thehtml);
	markon = true;
	 popup=$('#maprsinfo');
	 popup.hover(function()
							  {
								  onpop =true;
							  },
	function(){
							if(onpop) {setTimeout(popup.remove(),hideDelay);popup=null;onpop=false;}
							});
}

function hideInfo()
{
	if (hideDelayTimer) clearTimeout(hideDelayTimer);
	markon = false;
	 hideDelayTimer = setTimeout(function () {			
			hideDelayTimer = null;
			if(!onpop && !markon)
			{popup.remove();popup=null;onpop=false;}
			}, hideDelay);	

}


function showMsg(count,total,url)
{
	var msg="";
	if(total>100)
	{
		msg = "共"+total+"間餐廳。正顯示最多好評的"+count+"間。您可使用上方「篩選餐廳」功能進一步搜尋。";
	}else if(total==0)
	{
		msg = "此地圖範圍沒有符合條件的餐廳。請使用上方「篩選餐廳」功能選擇其他過濾條件。";
	}else
	{
		msg = '共找到'+count+'間餐廳。您可使用上方「篩選餐廳」功能進一步搜尋。';
	}
	msg += '<a href="'+url+'" class="maplink" target="_blank"><img src="'+map_icon_path+'/listmode.gif"  border="0" align="middle" /></a>';
	$('#msg').html(msg);
}

function getElementPos(elementId){
    var ua = navigator.userAgent.toLowerCase();
    var isOpera = (ua.indexOf('opera') != -1);
    var isIE = (ua.indexOf('msie') != -1 && !isOpera); // not opera spoof
    var el = document.getElementById(elementId);
    if (el.parentNode === null || el.style.display == 'none') {
        return false;
    }
    var parent = null;
    var pos = [];
    var box;
    if (el.getBoundingClientRect) //IE
    {
        box = el.getBoundingClientRect();
        var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
        var scrollLeft = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);
        return {
            x: box.left + scrollLeft,
            y: box.top + scrollTop
        };
    }
    else 
        if (document.getBoxObjectFor) // gecko    
        {
            box = document.getBoxObjectFor(el);
            var borderLeft = (el.style.borderLeftWidth) ? parseInt(el.style.borderLeftWidth) : 0;
            var borderTop = (el.style.borderTopWidth) ? parseInt(el.style.borderTopWidth) : 0;
            pos = [box.x - borderLeft, box.y - borderTop];
        }
        else // safari & opera    
        {
            pos = [el.offsetLeft, el.offsetTop];
            parent = el.offsetParent;
            if (parent != el) {
                while (parent) {
                    pos[0] += parent.offsetLeft;
                    pos[1] += parent.offsetTop;
                    parent = parent.offsetParent;
                }
            }
            if (ua.indexOf('opera') != -1 || (ua.indexOf('safari') != -1 && el.style.position == 'absolute')) {
                pos[0] -= document.body.offsetLeft;
                pos[1] -= document.body.offsetTop;
            }
        }
    if (el.parentNode) {
        parent = el.parentNode;
    }
    else {
        parent = null;
    }
    while (parent && parent.tagName != 'BODY' && parent.tagName != 'HTML') { // account for any scrolled ancestors
        pos[0] -= parent.scrollLeft;
        pos[1] -= parent.scrollTop;
        if (parent.parentNode) {
            parent = parent.parentNode;
        }
        else {
            parent = null;
        }
    }
    return {
        x: pos[0],
        y: pos[1]
    };
}

function setArea(obj)
{
	var area = $(obj).find("option:selected");
	var x = $(area).attr('lat');
	var y = $(area).attr('lng');
	var z = parseInt($(area).attr('zoom'));
	map.setCenter(new google.maps.LatLng(x,y));
	map.setZoom(z);
	showNearBy(0,1);
}

function updateDB(obj)
{
	var areaid = $(obj).val();
	
}

function gotoAddress(addr,cname,region,onsuccess,onreset){
	var country=null;var language=null;var postfix="";
	language='en';
	if(addr){
		geocoder=geocoder||new google.maps.Geocoder();
		country='CN';postfix=', china';
		geocoder.geocode({address:addr+postfix,language:language,region:country},function(results,status){
		if(status==google.maps.GeocoderStatus.OK&&!results[0].partial_match)
		{

			if(results[0].geometry.bounds)
			{map.fitBounds(results[0].geometry.bounds);}else{map.setZoom(17);}
			map.setCenter(results[0].geometry.location);showNearBy(0,1);
			if(onsuccess){return onsuccess(results[0].geometry.location);}
			return false;
		}
		$('#msg').html("找不到地址"+addr);
		//showMsg(0);
		return false;
		});
	}else{
		if(onreset)
		onreset();else
		showNearBy(0,1);
	}
		return false;
}
