var bounds = {};
var globalinfowindow;
var mapicons = [];
var mapmarkers = [];
var maplater = [];
var mapcluster;
var usedpositions = {};
var clusterinfowindow;

function loadmap(centerx, centery, id) {

	var mapElem = document.getElementById(id);
	mapElem.style.display = 'block';
	
	var map = new google.maps.Map(mapElem, {mapTypeId: google.maps.MapTypeId.ROADMAP, center: new google.maps.LatLng(centerx, centery), navigationControl: true, mapTypeControl: true, scaleControl: true, streetViewControl: true} );
	
	map.setZoom(13);
	
	bounds[id] = new google.maps.LatLngBounds();
	//bounds[id].extend(new google.maps.LatLng(centerx, centery));
	
	globalinfowindow = new google.maps.InfoWindow({ disableAutoPan: true });
		
	return map;

}

function createmarkerlater(map, lat, lon, text, url, divid, ashover, jump, atoz, bounce) {

	maplater.push({ map: map, lat: lat, lon: lon, text: text, url: url, divid: divid, ashover: ashover, jump: jump, atoz: atoz, bounce: bounce });
	
}

function flushmarkerqueue() {
	
	setTimeout(function() {
		var params = maplater.pop();
		if (typeof params === 'object') {
			createmarker(params.map, params.lat, params.lon, params.text, params.url, params.divid, params.ashover, params.jump, params.atoz, params.bounce);
			fitmarkers(params.map);
		}
		if (maplater.length) {
			flushmarkerqueue();
		}
	}, 2);
	
}

function createclusterer(map) {
	
	var styles = [{
        url: '/images/dynapack/mapclusterblue.png',
        height: 53,
        width: 52,
        opt_anchor: [32, 0],
        textColor: '#ffffff',
        opt_textSize: 12
    }];

	mapcluster = new MarkerClusterer(map, [], { maxZoom: 12, styles: styles });
	clusterinfowindow = new google.maps.InfoWindow({ maxWidth: 250 });

}

function plotclusteredmarkers() {
	
	if (typeof mapcluster === 'object') {	
		mapcluster.addMarkers(mapmarkers);
		fitmarkers(map);
	}
	
}

function createclusteredmarker(p) {

	if (usedpositions[p.lat + '_' + p.lon]) {
		return;
	}
	
	var latlng = new google.maps.LatLng(p.lat, p.lon);
	var marker = new google.maps.Marker({ position: latlng, title: p.title });
	
	google.maps.event.addListener(marker, 'click', function() {
		clusterinfowindow.setContent(p.content);
		clusterinfowindow.open(p.map, marker);
    });
    
	mapmarkers.push(marker);
	
	usedpositions[p.lat + '_' + p.lon] = 1;

	bounds[p['map'].getDiv().id].extend(latlng);
	
}

function createmarker(map, lat, lon, text, url, divid, ashover, jump, atoz, bounce) {

	if (atoz) {
		if (mapicons.length == 0) {
			for (var n = 65 ; n < 91 ; n++ ) {
				var icon = 'http://www.google.com/intl/en_ALL/mapfiles/marker_green'+String.fromCharCode(n)+'.png';
				mapicons.push(icon);
			}
		}		
	}
	
	var latlng = new google.maps.LatLng(lat, lon);
	var marker;

	if (bounce) {
		marker = new google.maps.Marker({position: latlng, map: map, icon: mapicons.shift(), animation: google.maps.Animation.DROP });
	} else {
		marker = new google.maps.Marker({position: latlng, map: map, icon: mapicons.shift() });
	}

	mapmarkers.push(marker);
	
	if (text) {
		var infowindow = new google.maps.InfoWindow({ content: text });		
		google.maps.event.addListener(marker, 'click', function() { infowindow.open(map,marker); });
	}
	if (url) {
		google.maps.event.addListener(marker, "click", function() {
			$('mapinfoframe').src = url;
			fithoteldetail('mapinfoframe');
		});
	}
	if (jump) {
		marker.resultanchor = jump;
		google.maps.event.addListener(marker, 'click', function() {
			
			if ($('suppliertimes')) {
				expandallhotelrows(2);
				
				var resultno = marker.resultanchor;
				resultno = resultno.replace(/^hotelid-/, "");
				
				expandhotelrow(resultno);				
			}

			Effect.ScrollTo(marker.resultanchor);

		});			
	}
	if (divid) {
		if ($(divid)) {			
			if (ashover) {
				marker.divid = divid;
				google.maps.event.addListener(marker, 'mouseover', function() { globalinfowindow.setContent($(marker.divid).innerHTML); globalinfowindow.open(map,marker) });
				google.maps.event.addListener(marker, 'mouseout', function() { globalinfowindow.close() });
				
			} else {
				var infowindow = new google.maps.InfoWindow({ content: $(divid).innerHTML });
				google.maps.event.addListener(marker, 'click', function() { infowindow.open(map,marker); });				
			}
		}	
	}

	bounds[map.getDiv().id].extend(latlng);

}

function deleteallmarkers(map) {
	
	maplater = [];
	usedpositions = {};
	bounds[map.getDiv().id] = new google.maps.LatLngBounds();

	if (mapmarkers) {
		for (i in mapmarkers) {
			if (mapmarkers.hasOwnProperty(i)) {
				mapmarkers[i].setMap(null);
			}
		}
		mapmarkers.length = 0;
		
		if (typeof mapcluster === 'object') {
			mapcluster.clearMarkers();
		}
	}
	
}

function createclickmarker(map, lat, lon, url, title) {

	var latlng = new google.maps.LatLng(lat, lon);

	var marker = new google.maps.Marker({position: latlng, map: map, title: title });

	google.maps.event.addListener(marker, 'click', function() { window.location = url });
	bounds[map.getDiv().id].extend(latlng);

}

function fitmarkers(map, drawbounds) {
	map.fitBounds(bounds[map.getDiv().id]);

	if (drawbounds) {
		new google.maps.Rectangle( {
			bounds: bounds[map.getDiv().id],
			map: map,
			fillColor: "#000000",
			fillOpacity: 0.2,
			strokeWeight: 0
		} );
	}
	
}

function fithoteldetail(frame) {

	$(frame).height = $(frame).contentWindow.document.body.scrollHeight + 'px';

}


