var centerLatitude = 8;
var centerLongitude = 3;
var startZoom = 2;

var cookie_expires ; with (cookie_expires = new Date()) setDate(getDate()+365);

var map;

var catch_infoopen = false;
var catch_biginfoopen = false;			// edit pane open?
var catch_infoclosing = false;
var current_marker;
var closetimer;
var tempmarker;

var mapskipicon;

var geosearchdone = false;
var geosearchmarker;


var filters = new Array();
filters[0] = 'ownstories';
filters[1] = 'ownplaces';
filters[2] = 'toprated';
filters[3] = 'audio';
filters[4] = 'video';
filters[5] = 'stories';
filters[6] = 'students';
var filter_panel_open = false;
var filter_filtering = true;
filter_set = new Array();
filter_set_key = new Array();
filter_set['ownstories'] = false;
filter_set_key['ownstories'] = 'o';
filter_set['ownplaces'] = false;
filter_set_key['ownplaces'] = 'p';
filter_set['toprated'] = false;
filter_set_key['toprated'] = 't';
filter_set['audio'] = false;
filter_set_key['audio'] = 'a';
filter_set['video'] = false;
filter_set_key['video'] = 'v';
filter_set['stories'] = true;
filter_set_key['stories'] = 's';
filter_set['students'] = true;
filter_set_key['students'] = 'c';

var retrieve_ongoing = false;
var retrieve_vars = '';


function init() {
	// priority of locations: world map - google geolocator - cookied location - place id parameter - geosearch
	// special maps: sounds always resets to world map
	if (special_map == 'sounds') {
		centerLatitude = 8;
		centerLongitude = 3;
		startZoom = 2;	
	} else {
		// check if Google's geolocator was successful
		if (google.loader.ClientLocation) {
			centerLatitude = google.loader.ClientLocation.latitude;
			centerLongitude = google.loader.ClientLocation.longitude;
			startZoom = 12;
		}
	
		// check for previous map settings
		oldcenter = GetCookie('mapskipcenter');
		oldzoom = GetCookie('mapskipzoom');
		if (oldcenter != null) {
			startZoom = Math.floor(oldzoom);
			coords = oldcenter.split(',');
			centerLatitude = parseFloat(coords[1]);
			centerLongitude = parseFloat(coords[0]);
		}
	
		// check if page has been called with place id as parameter, if so, center on it
		if (received_place != '') {
			centerLatitude = parseFloat(received_place_lat);
			centerLongitude = parseFloat(received_place_lng);
			edit_marker('id',parseFloat(received_place));
			startZoom = 16;
		}
	}

	// user is not logged in or is a new user
	if (userid == -1  &&  special_map == '') {
		$('siteinfo').setStyle('display', 'block');
		$('sitehelp').setStyle('display', 'none');
	} else {
		if (markers_created == '0'  &&  special_map == '') {
			$('sitehelp').setStyle('display', 'block');
		}
	}

	// set up the map
	map = new google.maps.Map2(document.getElementById("map"));
	map.addControl(new google.maps.SmallMapControl());
	map.addControl(new google.maps.MenuMapTypeControl());

	map.enableScrollWheelZoom();

	map.addMapType(G_PHYSICAL_MAP);

	if (special_map == 'sounds') {
		map.setMapType(G_PHYSICAL_MAP);
	}

	if (received_geosearch == '') {
		map.setCenter(new google.maps.LatLng(centerLatitude, centerLongitude), startZoom);		// use default or previous map center
	} else {
		mapShowAddress(received_geosearch);											// run geocoder search for submitted geo search
	}

	// retrieve filter for this session
	if (special_map == 'sounds') {
		filter_filtering = true;
		filter_set['audio'] = true;
		filter_set['stories'] = false;
	} else {
		filter_retrieve_presets();			// from cookie
	}

	//get the markers from the database
	retrieveMarkers();

	// set up map events
	google.maps.Event.addListener(map, "click", function(overlay, latlng, point) {
		if (userid != -1  &&  !overlay  &&  !catch_infoopen  &&  !catch_biginfoopen) {		// allow only if user is logged in and if info pane is not open
			//create an HTML DOM form element
	
			//retrieve the longitude and lattitude of the click point
			var lng = latlng.lng();
			var lat = latlng.lat();
	
			var inputForm = '<form id="newplaceform" onsubmit="storeMarker(); return false;">'
			+ '<div class="infohdr">Add a new place to MapSkip!</div>'
			+ '<div class="infodesc">What is the name of this place?</div>'
			+ '<input type="text" id="placename" class="shortfield" maxlength="64" />'
			+ '<div style="width:240px;text-align:right;"><a href="javascript:storeMarker();" class="buttonsave">Save</a>'
			+ '<input type="hidden" id="owner" value="' + userid + '"/>'
			+ '<input type="hidden" id="longitude" value="' + lng + '"/>'
			+ '<input type="hidden" id="latitude" value="' + lat + '"/>'
			+ '</form>';
	
			tempmarker = new google.maps.Marker(latlng,mapskipicon);
			map.addOverlay(tempmarker);

			tempmarker.openLittleInfoWindow(inputForm,260,true);
			
			$('newplaceform').placename.focus();
		}
	});
	
	google.maps.Event.addListener(map, "movestart", function() {
		close_all_marker_rollovers()
	});

	google.maps.Event.addListener(map, "moveend", function() {
		var center = map.getCenter();
		SetCookie ('mapskipcenter',center.lng().toString()+','+center.lat().toString(),cookie_expires,'/','mapskip.com');
		retrieveMarkers();
	});

	google.maps.Event.addListener(map, "zoomend", function() {
		var zoom = map.getZoom();
		SetCookie ('mapskipzoom',zoom.toString(),cookie_expires,'/','mapskip.com');
		retrieveMarkers();
	});


	mapskipicon = new google.maps.Icon();
	mapskipicon.image = 'http://cdn.mapskip.com/images/global/icon_map_hand.png';
	mapskipicon.iconSize = new google.maps.Size(23, 22);
	mapskipicon.shadow = "http://cdn.mapskip.com/images/global/icon_map_shadow.png";
	mapskipicon.shadowSize = new google.maps.Size(32, 22);
	mapskipicon.iconAnchor = new google.maps.Point(2, 22);
	mapskipicon.infoWindowAnchor = new google.maps.Point(5, 2);

	clustericon = new google.maps.Icon();
	clustericon.image = 'http://cdn.mapskip.com/images/global/icon_map_multihand.png';
	clustericon.iconSize = new google.maps.Size(26, 20);
	clustericon.shadow = "http://cdn.mapskip.com/images/global/icon_map_multishadow.png";
	clustericon.shadowSize = new google.maps.Size(31, 20);
	clustericon.iconAnchor = new google.maps.Point(2, 22);
	clustericon.infoWindowAnchor = new google.maps.Point(5, 2);

	arrowicon = new google.maps.Icon();
	arrowicon.image = 'http://cdn.mapskip.com/images/global/icon_map_arrow.png';
	arrowicon.iconSize = new google.maps.Size(31, 31);
	arrowicon.shadow = "http://cdn.mapskip.com/images/global/icon_map_arrowshadow.png";
	arrowicon.shadowSize = new google.maps.Size(31, 31);
	arrowicon.iconAnchor = new google.maps.Point(2, 33);

	topnav_init();

	if (special_map == 'sounds') {
		var sowo = new SWFObject('/flash/soundworld.swf','soundworldflash','190','45','8');
		sowo.addParam('wmode','transparent');
		sowo.write('soundworldplayer');
		$('filterbutton').setStyle('display','none');
		$('filtercheckmark').setStyle('display','none');
	}
}

google.setOnLoadCallback(init);



// user has created a new marker and submitted marker form
function storeMarker() {
	var lng = document.getElementById("longitude").value;
	var lat = document.getElementById("latitude").value;
	singlequote = /'/g;
	var placename = document.getElementById("placename").value.replace(singlequote,"\\'");
	
	ampersand = /&/g;
	placename = placename.replace(ampersand,"%26");
	pound = /#/g;
	placename = placename.replace(pound,"%23");
	collon = /:/g;
	placename = placename.replace(pound,"%3a");

	var getVars =  "?placename=" + placename
	+ "&owner=" + document.getElementById("owner").value
	+ "&lng=" + lng
	+ "&lat=" + lat;

	tempmarker.closeLittleInfoWindow();
//	map.removeOverlay(tempmarker);

	if (placename != '') {

		var request = google.maps.XmlHttp.create();
	
		//open the request to store_marker.php on your server
		request.open('GET', '/ajax/store_marker.php' + getVars, true);
		request.onreadystatechange = function() {
			if (request.readyState == 4) {
				//the request is complete
	
				var xmlDoc = request.responseXML;
	
				//retrieve the root document element (response)
				var responseNode = xmlDoc.documentElement;
	
				//retrieve the type attribute of the node
				var type = responseNode.getAttribute("type");
	
				//retrieve the content of the responseNode
				var content = responseNode.firstChild.nodeValue;
	
				//check to see if it was an error or success
				if(type!='success') {
//					alert(content);
				} else {
					//Create a new marker and add it's info window.
					var latlng = new google.maps.LatLng(parseFloat(lat),parseFloat(lng));
	
					var marker = createMarker(latlng, content.replace(/\\'/g,"'"));

					map.addOverlay(marker);
					map.closeInfoWindow();

					marker.openLittleInfoWindow(content.replace(/\\'/g,"'"),300);
				}
			}
		}
		request.send(null);
	}

	// if the filter is set to only show places with storys, disable filter
	if (filter_set['stories']) {
		$('filterform').stories.checked = false;
		filter_set['stories'] = false;
		fstatus = false;
		for (f=0;f<filters.length;f++) {
			if (filter_set[filters[f]]) {
				fstatus = true;
			}
		}
		if (!fstatus) {
			$('filtercheckmark').setStyle('display', 'none');
			filter_filtering = false;
		}
	}
}


function createMarker(latlng, html, type, photolist, audiolist) {
	if(type == 'c') {												// ##### cluster icon
		var marker = new google.maps.Marker(latlng, clustericon);
		google.maps.Event.addListener(marker,'click',function() {
			if(marker.LittleInfoWindowInstance) {
				marker.closeLittleInfoWindow();
			} else {
				clustertext = '<div class=infotools>There are too many places here<br>to show at this level, <a href="javascript:zoomhelper('+latlng.lat()+','+latlng.lng()+')">please zoom in</a><br>to discover more!<br><br><b><a href="javascript:zoomhelper('+latlng.lat()+','+latlng.lng()+')">Zoom In Now</a></b></div>';
				marker.openLittleInfoWindow(clustertext,250);
			}
		});
	} else {														// ##### standard hand
		var marker = new google.maps.Marker(latlng, mapskipicon);
		google.maps.Event.addListener(marker,'click',function() {
			if(marker.LittleInfoWindowInstance) {
				marker.closeLittleInfoWindow();
			} else {
				marker.openLittleInfoWindow(html,300);
			}
		});

		google.maps.Event.addListener(marker,'mouseover',function() {
			marker_rollover(latlng,photolist);
		});

		if (special_map == 'sounds') {							// sounds of the world rollover
			google.maps.Event.addListener(marker,'mouseover',function() {
				soundworld_play(audiolist);
			});
			google.maps.Event.addListener(marker,'mouseout',function() {
				soundworld_fadeout();
			});
		}
	}

	return marker;
}

// called from clustermarker link
function zoomhelper(lat,lng) {
	map.setCenter(new google.maps.LatLng(lat,lng), 9);
}



function retrieveMarkers() {
	// disable filter checkboxes until map markers are refreshed
	for (f=0;f<filters.length;f++) {
		eval("$('filterform')."+filters[f]+".disabled = true");
	}

	// remove the existing points
	map.clearOverlays();

	catch_infoopen = false;

	// create the boundary for the data to provide initial filtering
	var bounds = map.getBounds();
	var southWest = bounds.getSouthWest();
	var northEast = bounds.getNorthEast();
	var getVars = 'ne=' + northEast.toUrlValue() + '&sw=' + southWest.toUrlValue();

	if (filter_filtering) {
		var filtervar = '&filter=';
		// add filter codes
		for (f=0;f<filters.length;f++) {
			if (filter_set[filters[f]]) {
				filtervar = filtervar + filter_set_key[filters[f]];
			}
		}
		getVars = getVars + filtervar;
	}

	var request = google.maps.XmlHttp.create();

	// retrieve data
	if (!retrieve_ongoing  ||  (retrieve_ongoing  &&  retrieve_vars != getVars)) {
		request.open('GET', '/ajax/retrieve_markers.php?'+getVars, true);
		retrieve_ongoing = true;
		retrieve_vars = getVars;
	}

	// when done, create map markers
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			retrieve_ongoing = false;
			retrieve_vars = '';

			if (!ie4) {
				var xmlDoc = request.responseXML;
			} else {
				var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
				xmlDoc.loadXML(request.responseText);
			}

			var markers = xmlDoc.documentElement.getElementsByTagName("marker");
			for (var i = 0; i < markers.length; i++) {
				var lng = markers[i].getAttribute("lng");
				var lat = markers[i].getAttribute("lat");
				var type = markers[i].getAttribute("type");
				var photolist = markers[i].getAttribute("photolist");

				//check for lng and lat so MSIE does not error
				//on parseFloat of a null value
				if(lng && lat) {
					var latlng = new google.maps.LatLng(parseFloat(lat),parseFloat(lng));

					if (type == 'm') {									// marker
						ampersand = /%26/g;
						placename = markers[i].getAttribute("placename").replace(ampersand,"&");

						var html = '<div class="infohdr">'
						+ placename
						+ '</div><div class="infodesc">'
						+ markers[i].getAttribute("description").replace(/\#lt\#/g,'<').replace(/\#gt\#/g,'>')
						+ '</div>';
					} else {											// cluster
						html = '';
					}

					if (special_map == 'sounds') {
						var marker = createMarker(latlng,html,type,photolist,markers[i].getAttribute("audiolist"));
					} else {
						var marker = createMarker(latlng,html,type,photolist);
					}
					
					map.addOverlay(marker);
				}
			} //for

			// enable filter checkboxes once map markers have been retrieved
			for (f=0;f<filters.length;f++) {
				eval("$('filterform')."+filters[f]+".disabled = false");
			}
		} //if
	} //function for onreadystatechange

	request.send(null);
	
	if (geosearchdone) {
		map.addOverlay(geosearchmarker);
	}
}



// ##########################  custom infowindow ############################

//create the LittleInfoWindow overlay object
function LittleInfoWindow(marker,html,width) {
	this.html_ = html;
	this.width_ = ( width ? width + 'px' : 'auto');
	this.marker_ = marker;
}

//use the GOverlay class
LittleInfoWindow.prototype = new google.maps.Overlay();

//initialize the container and shadowContainer
LittleInfoWindow.prototype.initialize = function(map) {
	this.map_ = map;
	var container = document.createElement("div");
	container.style.display='none';
	map.getPane(G_MAP_FLOAT_PANE).appendChild(container);
	this.container_ = container;

	var shadowContainer = document.createElement("div");
	shadowContainer.style.display='none';
	map.getPane(G_MAP_FLOAT_SHADOW_PANE).appendChild(shadowContainer);
	this.shadowContainer_ = shadowContainer;
}

LittleInfoWindow.prototype.remove = function() {
	this.container_.parentNode.removeChild(this.container_);
	//don't forget to remove the shadow as well
	this.shadowContainer_.parentNode.removeChild(this.shadowContainer_);
}

LittleInfoWindow.prototype.copy = function() {
	return new LittleInfoWindow(this.marker_,this.html_,this.width_);
}

LittleInfoWindow.prototype.redraw = function(force) {
	if (!force) return;

	//get the content div
	var content = document.createElement("span");
	content.innerHTML = this.html_;
	content.style.font='10px verdana';
	content.style.margin='0';
	content.style.padding='0';
	content.style.border='0';
	content.style.display='block';

	if(!this.width_ || this.width_=='auto' || this.width_ <= 0) {
		//the width is unknown so set a rough maximum and minimum
		content.style.minWidth = '10px';
		content.style.maxWidth = '500px';
		content.style.width = 'auto';
	} else {
		//the width was set when creating the window
		content.style.width= this.width_;
	}

	//make it invisible for now
	content.style.visibility='hidden';

	//temporarily append the content to the map container
	this.map_.getContainer().appendChild(content);

	//retrieve the rendered width and height
	var contentWidth = content.offsetWidth;
	var contentHeight = content.offsetHeight;
	//remove the content from the map
	content.parentNode.removeChild(content);
	content.style.visibility='visible';

	//set the width and height to ensure they
	//stay that size when drawn again
	content.style.width=contentWidth+'px';
	content.style.height=contentHeight+'px';

	//set up the actual position relative to your images
	content.style.position='absolute';
	content.style.left='10px';
	content.style.top='13px';
	content.style.background='#fff8de';

	//create the wrapper for the window
	var wrapper = document.createElement("div");

	//first append the content so the wrapper is above
	wrapper.appendChild(content);

	//create an object to reference each image
	var wrapperParts = {
		tl:{l:0, t:0, w:10, h:13},
		t:{l:10, t:0, w:(contentWidth-5), h:13},
		tr:{l:(contentWidth+2), t:0, w:16, h:16},
		l:{l:0, t:13, w:10, h:contentHeight},
		r:{l:(contentWidth+5), t:16, w:13, h:(contentHeight-3)},
		bl:{l:0, t:(contentHeight+13), w:3, h:10},
		p:{l:3, t:(contentHeight+13), w:26, h:23},
		b:{l:29, t:(contentHeight+13), w:(contentWidth-21), h:10},
		br:{l:(contentWidth+5), t:(contentHeight+13), w:13, h:10}
	}

	//create the image DOM objects
	for (i in wrapperParts) {
		var img = document.createElement('img');
		//load the image from your local image directory
		//based on the property name of the wrapperParts object
		img.src = 'images/infowindow/' + i + '.png';
		//set the appropriate positioning attributes
		img.style.position='absolute';
		img.style.top=wrapperParts[i].t+'px';
		img.style.left=wrapperParts[i].l+'px';
		img.style.width=wrapperParts[i].w+'px';
		img.style.height=wrapperParts[i].h+'px';
		wrapper.appendChild(img);
		wrapperParts[i].img = img;
	}

	//add any event handlers like the close box
	var marker = this.marker_;
	google.maps.Event.addDomListener(wrapperParts.tr.img, "click", function() {
		marker.closeLittleInfoWindow();
	});
	
/*
	if (content.innerHTML.indexOf('placename') != -1 ) {
		google.maps.Event.addDomListener(content, "click", function() {		// fix to focus on form element for place name if used for new markerentry
			document.getElementById("placename").focus();
		});
	}
*/

	//get the X,Y pixel location of the marker
	var pixelLocation = this.map_.fromLatLngToDivPixel(
	this.marker_.getPoint()
	);

	//position the container div for the window
	this.container_.style.position='absolute';
	this.container_.style.left = (pixelLocation.x+3) + "px";
	this.container_.style.top = (pixelLocation.y
		- contentHeight
		- 29
		- this.marker_.getIcon().iconSize.height
	) + "px";
	
	this.container_.style.border = '0';
	this.container_.style.margin = '0';
	this.container_.style.padding = '0';
	this.container_.style.display = 'block';
	
	//append the styled info window to the container
	this.container_.appendChild(wrapper);

	//add a shadow
	this.shadowContainer_.style.position='absolute';
	this.shadowContainer_.style.left = (pixelLocation.x+15) + "px";
	this.shadowContainer_.style.top = (pixelLocation.y
		- 10
		- this.marker_.getIcon().iconSize.height
	) + "px";

	this.shadowContainer_.style.border = '1px solid black';
	this.shadowContainer_.style.margin = '0';
	this.shadowContainer_.style.padding = '0';
	this.shadowContainer_.style.display = 'block';

	var shadowParts = {
		sl:{l:0, t:0, w:35, h:26},
		s:{l:35, t:0, w:(contentWidth-40), h:26},
		sr:{l:(contentWidth-5), t:0, w:35, h:26}
	}

	for (i in shadowParts) {
		var img = document.createElement('img');
		img.src = 'images/infowindow/' + i + '.png';
		img.style.position='absolute';
		img.style.top=shadowParts[i].t+'px';
		img.style.left=shadowParts[i].l+'px';
		img.style.width=shadowParts[i].w+'px';
		img.style.height=shadowParts[i].h+'px';
		this.shadowContainer_.appendChild(img);
	}
/*
	//pan if necessary so it shows on the screen
	var mapNE = this.map_.fromLatLngToDivPixel(
		this.map_.getBounds().getNorthEast()
	);

	var panX=0;
	var panY=0;

	if(this.container_.offsetTop < mapNE.y) {
		//top of window is above the top edge of the map container
		panY = mapNE.y - this.container_.offsetTop;
	}

	if(this.container_.offsetLeft+contentWidth+10 > mapNE.x) {
		//right edge of window is outside the right edge of the map container
		panX = (this.container_.offsetLeft+contentWidth+10) - mapNE.x;
	}

	if(panX!=0 || panY!=0) {
		//pan the map
		this.map_.panBy(new google.maps.Size(-panX-10,panY+30));
	}
*/
}



//add a new method to GMarker so you
//can use a similar API to the existing info window.
google.maps.Marker.prototype.LittleInfoWindowInstance = null;

google.maps.Marker.prototype.openLittleInfoWindow = function(content,width,isform) {
	if(this.LittleInfoWindowInstance == null  &&  !catch_biginfoopen) {
		if (catch_infoopen == true) {
			current_marker.closeLittleInfoWindow();
		}
		this.LittleInfoWindowInstance = new LittleInfoWindow(
			this,
			content,
			width
		);
		map.addOverlay(this.LittleInfoWindowInstance);
		catch_infoopen = true;
		current_marker = this;

		close_all_marker_rollovers();											// image icon rollovers

		if (!isform) {
			closetimer = setTimeout('close_openmarker()',20000);				// close open marker automatically
		}
	}
}

google.maps.Marker.prototype.closeLittleInfoWindow = function() {
	if(this.LittleInfoWindowInstance != null) {
	
		if (this.LittleInfoWindowInstance.html_.indexOf('form') != -1) {
			map.removeOverlay(tempmarker);
		}
	
		clearTimeout(closetimer);												// clear existing timer
		map.removeOverlay(this.LittleInfoWindowInstance);
		this.LittleInfoWindowInstance = null;
		catch_infoopen = false;
		catch_infoclosing = true;
		cleanuptimer = setTimeout('closing_cleanup()',200);						// FIX THIS: necessary?
	}
}

function closing_cleanup() {
	catch_infoclosing = false;
}

function close_openmarker() {													// close open marker automatically
	current_marker.closeLittleInfoWindow();
}






// ############## geocoder functions

var geocoder = new google.maps.ClientGeocoder();

function mapShowAddress(address) {
  geocoder.getLatLng(
    address,
    function(point) {
      if (!point) {
        show_mapalert('Sorry, but the address you have entered<br>could not be located:<br>' + address);
      } else {
        map.setCenter(point, 13);
		geosearchmarker = new google.maps.Marker(point, arrowicon);
		geosearchdone = true;
        map.addOverlay(geosearchmarker);
//        marker.openLittleInfoWindow(address,150,false);
      }
    }
  );
}

function show_mapalert(s) {
	content = '<div style="float:right;">';
	content = content + '<a href="javascript:hide_mapalert();" class="buttonclose">&nbsp;</a>';
	content = content + '</div><div style="padding-top:20px;">' + s + '</div>';
	d_write_layer('mapalert',content);
	$('mapalert').setStyle('display', 'block');
}

function hide_mapalert() {
	$('mapalert').setStyle('display', 'none');
}




// ################ additional marker manipulation for marker owner

function remove_marker(mid,mname) {
	mname = mname.replace(/\|/g, "'");
	mname = mname.replace(/_/g, " ");
	alerttext = '<div style="font-size:1.2em;font-weight:normal;">Do you want to delete the place marker<br>"'+mname+'"?<\/div>';
	alerttext = alerttext + '<div style="float:left;padding:10px 0 0 0"><a href="javascript:hide_mapalert();" class="buttonback">Cancel</a><\/div>';
	alerttext = alerttext + '<div style="float:left;padding:10px 0 0 110px;"><a href="javascript:remove_marker_call('+mid+');" class="buttondone">Delete</a><\/div>';
	show_mapalert(alerttext);
}

function remove_marker_call(mid) {
	hide_mapalert();

	//open the request to store_marker.php on your server
	new Ajax('/ajax/remove_marker.php', {
		postBody: Object.toQueryString({marker: mid}),
		evalScripts: false,
		onComplete: function(){
			window.location.href = 'http://www.mapskip.com/';
		}
	}).request();

}


function change_marker(mid,mname) {
	mname = mname.replace(/\|/g, "'");
	mname = mname.replace(/_/g, " ");
	alerttext = '<div style="font-size:1.2em;font-weight:normal;">Current name of the place marker:<br>"'+mname+'"<\/div>';
	alerttext = alerttext + '<div style="font-size:1.2em;font-weight:normal;"><br>New name:<br><form name="renameform" id="renameform" onsubmit="change_marker_call('+mid+'); return false;">';
	alerttext = alerttext + '<input type="text" id="newplacename" class="shortfield" maxlength="64" /><\/form><\/div>';
	alerttext = alerttext + '<div style="float:left;padding:10px 0 0 0"><a href="javascript:hide_mapalert();" class="buttonback">Cancel</a><\/div>';
	alerttext = alerttext + '<div style="float:left;padding:10px 0 0 110px;"><a href="javascript:change_marker_call('+mid+');" class="buttonsave">Rename</a><\/div>';
	show_mapalert(alerttext);

}

function change_marker_call(mid) {
	mname = $('renameform').newplacename.value;
	if (mname != '') {
		hide_mapalert();
		//open the request to store_marker.php on your server
		new Ajax('/ajax/store_markername.php', {
			postBody: Object.toQueryString({marker: mid, newname: mname}),
			evalScripts: false,
			onComplete: function(){
				window.location.href = 'http://www.mapskip.com/';
			}
		}).request();
	}
}





// ################ map filter code

function filter_toggle() {
	if (filter_panel_open) {
		$('filterpanel').setStyle('display', 'none');
		$('filterpanelclose').setStyle('display', 'none');
		filter_panel_open = false;
	} else {
		$('filterpanel').setStyle('display', 'block');
		$('filterpanelclose').setStyle('display', 'block');
		filter_panel_open = true;
	}
}

function filter_clear() {
	for (f=0;f<filters.length;f++) {
		filter_set[filters[f]] = false;
		eval("$('filterform')."+filters[f]+".checked = false");
	}
	$('filtercheckmark').setStyle('display', 'none');
	filter_filtering = false;
	retrieveMarkers();
	filter_toggle();
}

function filter_change(filterobj) {		// called from click event on filter checkboxes
	// first check if places with stories is checked and this is a click on another filter
	if (filterobj.name != 'stories') {
		if (filter_set['stories']) {
			$('filterform').stories.checked = false;
			filter_set['stories'] = false;
		}
	} else {
		// instead if stories has been clicked, remove all other filters
		for (f=0;f<filters.length;f++) {
			if (filters[f] != 'stories') {
				filter_set[filters[f]] = false;
				eval("$('filterform')."+filters[f]+".checked = false");
			}
		}
	}
	filter_set[filterobj.name] = filterobj.checked;
	fstatus = false;
	filtercookie = '';
	for (f=0;f<filters.length;f++) {
		if (filter_set[filters[f]]) {
			fstatus = true;
			filtercookie = filtercookie + filter_set_key[filters[f]];
		}
	}
	SetCookie ('mapskipfilter',filtercookie,null,'/','mapskip.com');
	if (fstatus) {
		$('filtercheckmark').setStyle('display', 'block');
		filter_filtering = true;
	} else {
		$('filtercheckmark').setStyle('display', 'none');
		filter_filtering = false;
	}
	retrieveMarkers();
}

function filter_retrieve_presets() {
	oldfilter = GetCookie('mapskipfilter');
	if (oldfilter != null) {
		nofilter = true;
		for (f=0;f<filters.length;f++) {
			if (oldfilter.indexOf(filter_set_key[filters[f]]) != -1) {	// filter was set in cookie
				filter_set[filters[f]] = true;
				eval("$('filterform')."+filters[f]+".checked = true");
				nofilter = false;
			} else {
				filter_set[filters[f]] = false;
				eval("$('filterform')."+filters[f]+".checked = false");			
			}
		}
		if (nofilter) {
			$('filtercheckmark').setStyle('display', 'none');
			filter_filtering = false;
		} else {
			$('filtercheckmark').setStyle('display', 'block');
			filter_filtering = true;
		}
	}
}



// ################# marker rollover image icons

var marker_counter = 0;
marker_buffer = new Array();
marker_effects = new Array();

function marker_rollover(mlatlng,photolist) {
	if (!catch_infoopen  &&  photolist != '') {
		photolist = photolist.substring(0,photolist.length-1);
		pixelpos = map.fromLatLngToContainerPixel(mlatlng);

		var div = new Element('div');
		div.setProperty('id', 'markerrollover'+marker_counter);
		div.injectInside('container');
		$('markerrollover'+marker_counter).addClass('markerrolloverclass');
		$('markerrollover'+marker_counter).setStyle('left',(pixelpos.x+75)+'px');
		$('markerrollover'+marker_counter).setStyle('top',(pixelpos.y+55)+'px');
		
		if (photolist.indexOf(',') != -1) { 
			photoexp = photolist.split(',');
			randphoto = photoexp[Math.floor(Math.random() * photoexp.length)];
		} else {
			randphoto = photolist;
		}

		$('markerrollover'+marker_counter).setStyle('opacity','0');
		d_write_layer('markerrollover'+marker_counter,'<img src="/sitetools/image.php?image_name='+randphoto+'.jpg&style=tiny" class="markerrolloverimg">');
		marker_effects[marker_counter] = new Fx.Style('markerrollover'+marker_counter, 'opacity', {
			duration: 700,
			fps: 30,
			transition: Fx.Transitions.Cubic.easeOut
		});
		marker_effects[marker_counter].start(0,1);

		marker_rollover_timer = setTimeout('marker_rollout_close('+marker_counter+')',1000);
		marker_buffer[marker_counter] = true;
		marker_counter++;
	}
}

function marker_rollout_close(mc) {
	marker_effects[mc] = new Fx.Style('markerrollover'+mc, 'opacity', {
		duration: 2000,
		fps: 30,
		transition: Fx.Transitions.Cubic.easeOut
	});
	marker_effects[mc].start(1,0);
	marker_delete_timer = setTimeout('marker_rollout_delete('+mc+')',2100);
}

function marker_rollout_delete(md) {
	if (marker_buffer[md]) {
		pb = document.getElementById('container');
		olddiv = document.getElementById('markerrollover'+md);
		pb.removeChild(olddiv);
		marker_buffer[md] = false;
	}
}

function close_all_marker_rollovers() {
	for (mb=0;mb<marker_effects.length;mb++) {
		if (marker_effects[mb]) {
			marker_effects[mb].stop();
		}
	}
	for (mb=0;mb<marker_buffer.length;mb++) {
		if (marker_buffer[mb]) {
			marker_rollout_delete(mb);
		}
	}
}










