/** Tooltip
 * @author Marco Alionso Ramirez, marco@onemarco.com
 * @url http://onemarco.com
 * @version 1.0
 * This code is public domain
 */
var alreadyLoadedPosition = new Array();
var alreadyLoadedId = new Hash();
var loadNearRestaurants=true;
var map=null;

/**
 * The Tooltip class is an addon designed for the Google Maps GMarker class. 
 * @constructor
 * @param {GMarker} marker
 * @param {String} text
 * @param {Number} padding
 */
function Tooltip(marker, headertype,title,city,street, padding){
	this.marker_ = marker;
	this.headertype_=headertype;
	this.title_ = title;
	this.city_ = city;
	this.street_ = street;
	this.padding_ = padding;
}


function createRootMarker(point,markerOptions,markerInfos) {
	var RootMarker = new GMarker(point,markerOptions);
	var toolTipElement = new Tooltip(RootMarker,"h1",markerInfos.name,markerInfos.postal+' '+markerInfos.city,markerInfos.street+' '+markerInfos.streetnumber,1);
	RootMarker.tooltip=toolTipElement;
	map.addOverlay(RootMarker); 
	map.addOverlay(toolTipElement); 
	GEvent.addListener(RootMarker,'mouseover',function(){ 
		toolTipElement.show(); 
	}); 
	GEvent.addListener(RootMarker,'mouseout',function(){ 
		toolTipElement.hide(); 
	});
	return RootMarker;
}
function createMarker(point,markerOptions,markerInfos) {
	var marker = new GMarker(point,markerOptions);
	var toolTipElement = new Tooltip(marker,"h2",markerInfos.name,markerInfos.postal+' '+markerInfos.city,markerInfos.street+' '+markerInfos.streetnumber,4);
	marker.tooltip=toolTipElement;
	if(markerInfos.link!=''){
		GEvent.addListener(marker, "click", function() {
			location.href=markerInfos.link;
		});
	}
	map.addOverlay(marker); 
	map.addOverlay(toolTipElement); 
	GEvent.addListener(marker,'mouseover',function(){ 
		toolTipElement.show(); 
	}); 
	GEvent.addListener(marker,'mouseout',function(){ 
		toolTipElement.hide(); 
	});
	return marker;
}
var RestaurantData=false;
function googleinitialize() {
	
	$('address-Gmap').style.display='block';
	var tinyIcon = new GIcon(G_DEFAULT_ICON);
	tinyIcon.image = "/application/cherry/images/marker/google_icon_small.png";
	tinyIcon.shadow = "/application/cherry/images/marker/google_shadow_small.png";
	tinyIcon.iconSize = new GSize(12, 20);
	tinyIcon.shadowSize = new GSize(22, 20);
	tinyIcon.iconAnchor = new GPoint(6, 20);
	tinyIcon.infoWindowAnchor = new GPoint(5, 1);
	var url=location.pathname;
	var urlarray=url.split('/');
	
	map = new google.maps.Map2($("address-Gmap"));
	map.enableScrollWheelZoom();

	Tooltip.prototype = new GOverlay();
	Tooltip.prototype.initialize = function(map){
		var div = document.createElement("div");
		var title=document.createElement(this.headertype_);
		var city=document.createElement("div");
		var street=document.createElement("div");
		title.appendChild(document.createTextNode(this.title_));
		city.appendChild(document.createTextNode(this.city_));
		street.appendChild(document.createTextNode(this.street_));
		div.appendChild(title);
		div.appendChild(city);
		div.appendChild(street);
		//div.appendChild(document.createTextNode(this.text_));
		div.className = 'googletooltip';
		div.style.position = 'absolute';
		div.style.visibility = 'hidden';
		map.getPane(G_MAP_FLOAT_PANE).appendChild(div);
		this.map_ = map;
		this.div_ = div;
	}
	
	Tooltip.prototype.remove = function(){
		this.div_.parentNode.removeChild(this.div_);
	}
	
	Tooltip.prototype.copy = function(){
		return new Tooltip(this.marker_,this.headertype_this.title_,this.city_,this.street_,this.padding_);
	}
	
	Tooltip.prototype.redraw = function(force){
		if (!force) return;
		var markerPos = this.map_.fromLatLngToDivPixel(this.marker_.getPoint());
		var iconAnchor = this.marker_.getIcon().iconAnchor;
		var xPos = Math.round(markerPos.x - this.div_.clientWidth / 2);
		var yPos = markerPos.y - iconAnchor.y - this.div_.clientHeight - this.padding_;
		this.div_.style.top = yPos + 'px';
		this.div_.style.left = xPos + 'px';
	}
	
	Tooltip.prototype.show = function(){
		this.div_.style.visibility = 'visible';
	}
	
	Tooltip.prototype.hide = function(){
		this.div_.style.visibility = 'hidden';
	}
	
	
	
	map.size=new GSize(350,250);
	var topleft = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(5,5));
	var topleftbottom = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(5,35));

	map.removeMapType(G_SATELLITE_MAP);
	map.removeMapType(G_HYBRID_MAP);
	map.addMapType(G_PHYSICAL_MAP);
	map.addControl(new GSmallMapControl(),topleftbottom);
	map.addControl(new GMapTypeControl(),topleft);
	new Ajax.Request(
		'/json/getrestaurantdata/id/'+urlarray[4],
		{
			method: 'get',
			asynchronous:false,
			onSuccess:function(response){
				RestaurantData=response.responseText.evalJSON();
			}
		}
	); 
	restaurantLocation=new google.maps.LatLng(RestaurantData.latitude,RestaurantData.longitude);
	var zoom=13;//default
	var restaurantPostal=String(RestaurantData.postal);
	if(restaurantPostal.indexOf('1')==0){ //set higher zoom in vienna
		zoom=14;
	}
	map.setCenter(restaurantLocation, zoom);
	
	alreadyLoadedPosition[map.getCenter().lng()+'|'+map.getCenter().lat()]=true;
	var rIcon = new GIcon(G_DEFAULT_ICON);
	rIcon.image='/application/cherry/images/marker/restaurantmarker.png';
	if(RestaurantData.writeable==true){
		markerOptions={icon:rIcon, clickable:false,draggable:true};
	}
	else{
		markerOptions={icon:rIcon, clickable:false};
	}
	
	restaurantMarker=createRootMarker(restaurantLocation,markerOptions,RestaurantData);
	alreadyLoadedId.set(RestaurantData.id,restaurantMarker)
	map.addOverlay(restaurantMarker);
	if(RestaurantData.writeable==true){ 
		GEvent.addListener(restaurantMarker, "dragend", function() {
			requestUrl=window.location.protocol+'//'+window.location.hostname+'/json/setposition/id/'+urlarray[4];
			var updateNavigation = new Ajax.Request(
				requestUrl,
				{
					method: 'post',
					parameters: "longitude="+restaurantMarker.getPoint().lng()+"&latitude="+restaurantMarker.getPoint().lat(),
					onSuccess: function setPositionsToInputField(transport){
						var responseArray =  transport.responseText.evalJSON(true);
						if($('address-longitude') != undefined){
							$('address-longitude').value=responseArray['longitude'];
							
						}
						if($('address-latitude') != undefined){
							$('address-latitude').value=responseArray['latitude'];
							
						}
					}
				}
			);
		});
	}
	GEvent.addListener(map, "moveend", function() {
		var center = map.getCenter();
		requestUrl=window.location.protocol+'//'+window.location.hostname+'/json/loadnearestrestaurantsbyposition';
		if(alreadyLoadedPosition[map.getCenter().lng()+'|'+map.getCenter().lat()] == undefined && loadNearRestaurants==true){
			alreadyLoadedPosition[map.getCenter().lng()+'|'+map.getCenter().lat()]=true;
			var updateNavigation = new Ajax.Request(
				requestUrl,
				{
					method: 'post',
					asynchronous: true,
					requestHeaders: {Accept: 'application/json'},
					parameters: "longitude="+map.getCenter().lng()+"&latitude="+map.getCenter().lat(),
					onSuccess:function drawRestaurantsPosition(transport){
						var responseArray =  transport.responseText.evalJSON(true);
						var locationOptions = {icon:tinyIcon};
						for(var i=0;i<responseArray.length;i++){
							if(alreadyLoadedId.get(responseArray[i].id) == undefined){
								var locationPointX= new GPoint(responseArray[i].longitude,responseArray[i].latitude);
								var locationMarkerX = createMarker(locationPointX,locationOptions,responseArray[i]);
								map.addOverlay(locationMarkerX);
								alreadyLoadedId.set(responseArray[i].id,locationMarkerX);
							}
						}
					}
				}
			);
		}
		{
			loadNearRestaurants=true;
		}
	});

	requestUrl=window.location.protocol+'//'+window.location.hostname+'/json/loadnearestrestaurants/id/'+urlarray[4];
	var updateNavigation = new Ajax.Request(
		requestUrl,
		{
			method: 'post',
			asynchronous: true,
			requestHeaders: {Accept: 'application/json'},
			onSuccess:function drawRestaurants(transport){
				var responseArray =  transport.responseText.evalJSON(true);
				var locationOptions = {icon:tinyIcon};
				for(var i=0;i<responseArray.length;i++){
					if(alreadyLoadedId.get(responseArray[i].id) == undefined){
						var locationPoint= new GPoint(responseArray[i].longitude,responseArray[i].latitude);
						var locationMarker = createMarker(locationPoint,locationOptions,responseArray[i]);
						map.addOverlay(locationMarker);
						alreadyLoadedId.set(responseArray[i].id,locationMarker);
					}
				}
			}
		}
	);
	if(RestaurantData.displayGooglelocation==true){
		verifyAddress(map);
	}
	/*if(RestaurantData.displayGooglelocation==true){
		locateAddress(map);
	}*/
}

function MOGI_googlemap(){
	google.load("maps", "2.x",{"callback":googleinitialize});
}
function showLocalTooltip(restaurantid){
	if(RestaurantData!=false){
		alreadyLoadedId.each(
			function hideing(element){
				if(element.key!=undefined && element.key!=RestaurantData.id){
					element.value.hide();
				}
			}
		);
		localRestaurantObject=alreadyLoadedId.get(restaurantid);
		localRestaurantObject.show();
		localRestaurantObject.tooltip.show();
	}
}
function hideLocalTooltip(restaurantid){
	if(RestaurantData!=false){
		alreadyLoadedId.get(restaurantid).tooltip.hide();
		alreadyLoadedId.each(
			function hideing(element){
				if(element.key!=undefined && element.key!=RestaurantData.id){
					element.value.show();
				}
			}
		);
	}
}


function createGoogleMarker(map,point) {
	var googleIcon = new GIcon(G_DEFAULT_ICON);
	googleIcon.image = "/application/cherry/images/marker/google_icon_reference.png";
	googleIcon.shadow = "/application/cherry/images/marker/google_shadow_small.png";
	googleIcon.iconSize = new GSize(12, 20);
	googleIcon.shadowSize = new GSize(22, 20);
	googleIcon.iconAnchor = new GPoint(6, 20);
	googleIcon.infoWindowAnchor = new GPoint(5, 1);

	var marker = new GMarker(point,{icon:googleIcon, clickable:false});
	GEvent.addListener(marker, "click", function() {
		//location.href=link;
	});
	map.addOverlay(marker); 
	
	return marker;
}

function verifyAddress(map) {
	var geocoder = new GClientGeocoder();
	//clientPosition=new google.loader.ClientLocation;
	geocoder.getLatLng(				
		'austria, '+RestaurantData.postal+' '+RestaurantData.city+', '+RestaurantData.street+' '+RestaurantData.streetnumber,
		function(point) {
			if (point) {
				/*map2.setCenter(point, 16);
				map2.setZoom(16);*/
				createGoogleMarker(map,point);
			}
		}
	);
}
function locateAddress(map) {
	var geocoder = new GClientGeocoder();
	//clientPosition=new google.loader.ClientLocation;
	var url=location.pathname;
	var urlarray=url.split('/');
	geocoder.getLatLng(				
		'austria, '+RestaurantData.postal+' '+RestaurantData.city+', '+RestaurantData.street+' '+RestaurantData.streetnumber,
		function(point) {
			if (point) {
				/*map2.setCenter(point, 16);
				map2.setZoom(16);*/
				//createGoogleMarker(map,point);
				requestUrl=window.location.protocol+'//'+window.location.hostname+'/xml/setposition/id/'+urlarray[4];
				var updateNavigation = new Ajax.Request(
					requestUrl,
					{
						method: 'post',
						parameters: "longitude="+point.lng()+"&latitude="+point.lat()
					}
				);
			}
		}
	);
}
