var map;
var mapclick;
var welcome_msg = "<b>Welcome!</b><br />See where members of the site live!<br /><br />Use the controls to the left of this box to move around the map, or click and hold the left mouse button, and move the mouse to recenter the map.";
var add_msg = "<span id=\"addtext\"><b>Add yourself!</b><br />Click the button below to add yourself to the map<br /><br /><input type=\"button\" value=\"Add\" onclick=\"addpin(this);\" /></span>";
var search_msg = "<form method=\"get\" id=\"google\"><p><label>Search:</label> <input type=\"text\" size=\"40\" name=\"googlesearch\" id=\"googlesearch\" value=\"Enter a postcode or place name\" onfocus=\"this.value=''\" /> <input type=\"submit\" value=\"Search\" />";
var zoomloc = "<span> | <a href=\"#\" id=\"zoomhome\">Zoom to my location</a></span>";

function closewelcome() {
	Effect.SwitchOff('mapinfob',{duration:0.5});

	alreadyadded = false;

	fans.each(function(e) {
		if(e.loggedin == 1) {
			alreadyadded = true;
		}
	});

	if(alreadyadded == false && loggedinid) {
		window.setTimeout("Effect.Appear('mapaddb',{from:0,to:0.8})",2000);
	} else if(alreadyadded == false && !loggedinid) {
		$('addtext').update("<b>Add yourself!</b><br />To add yourself to the map, you must be logged in to the site.<br /><br />Use the login box to the right to login.");
		window.setTimeout("Effect.Appear('mapaddb',{from:0,to:0.8})",2000);
	}
	return false;
}

function closeadd() {
	Effect.SwitchOff('mapaddb',{duration:0.5});
	return false;
}

function addpin(x) {
	$('wheremap').addClassName('add');
	$('addtext').update("<b>Adding a pin</b><br />Move over the map and left click where you want to add yourself.<br /><br />You can still use the zoom functions to the left in order to place your pin more accurately.");

	mapclick = GEvent.addListener(map, "click", function(overlay, point) {
		if (!overlay) {
			createInputMarker(point);
		}
	});
}

function zomehomefunc() {
	Event.observe($('zoomhome'),"click", function(e) {
		fans.each(function(e) {
			if(e.loggedin == 1) {
				map.setCenter(new GLatLng(e.lat, e.lng), 12);
			}
		});
		Event.stop(e);
	});
}

function createInputMarker(point) {
	//pointjson = encodeURIComponent(Object.toJSON(point));

	new Ajax.Request(
		'ajax/whereareya.php?action=save&lat='+point.y+'&lng='+point.x, {
			method: 'get',
			onSuccess: function(transport) {
				var result = transport.responseText.evalJSON(true);
				eval("fans["+fans.length+"] = new fan("+result.object+")");
				map.addOverlay(fans[(fans.length-1)].marker);
				//clusterer.AddMarker(fans[(fans.length-1)].marker,fans[(fans.length-1)].username);
				lastmarker = fans[(fans.length-1)].marker;
				GEvent.removeListener(mapclick);
				$('wheremap').removeClassName('add');
				$('addtext').update("<b>You've been added!</b><br />Congratulations you have now been added to the map.<br /><br />You may drag your pin around the map to adjust it's positioning.");
				$('mapsearch').update($('mapsearch').innerHTML.replace("</form>",zoomloc+"</p></form>"));
				$('mapsearch').update($('mapsearch').innerHTML.replace("</FORM>",zoomloc+"</p></form>"));
				zomehomefunc();
			}
		}
	);
}

function whereinit() {
	if (GBrowserIsCompatible()) {
		map = new GMap2($("wheremap"));
		var clusterer = new Clusterer(map);
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		map.setCenter(new GLatLng(51.3983,-0.0854),2);
		map.enableScrollWheelZoom();
		map.addControl(new HtmlControl('<div class="mapbox" id="mapinfob">'+welcome_msg+'<a href="#" onclick="return closewelcome();">&nbsp;</a></div>'));
		map.addControl(new HtmlControl('<div class="mapbox" id="mapaddb" style=\"display:none;\">'+add_msg+'<a href="#" onclick="return closeadd();">&nbsp;</a></div>'));

		alreadyadded = false;

		fans.each(function(e) {
			if(e.loggedin == 1) {
				alreadyadded = true;
			}
		});

		if(alreadyadded) {
			map.addControl(new HtmlControl('<div class="mapbox" id="mapsearch">'+search_msg+zoomloc+'</p></form></div>'));
		} else {
			map.addControl(new HtmlControl('<div class="mapbox" id="mapsearch">'+search_msg+'</p></form></div>'));
		}
	}

	new Draggable('mapinfob', {
	   snap: function(x, y, draggable) {
		  function constrain(n, lower, upper) {
			 if (n > upper) return upper;
			 else if (n < lower) return lower;
			 else return n;
		  }
		  var element = draggable.element.getDimensions();
		  var parent = $("wheremap").getDimensions();
		  return [
			 constrain(x, 0, (parent.width-10) - element.width),
			 constrain(y, 0, (parent.height-50) - element.height)
		  ];
	   }
	});

	new Draggable('mapaddb', {
	   snap: function(x, y, draggable) {
		  function constrain(n, lower, upper) {
			 if (n > upper) return upper;
			 else if (n < lower) return lower;
			 else return n;
		  }
		  var element = draggable.element.getDimensions();
		  var parent = $("wheremap").getDimensions();
		  return [
			 constrain(x, 0, (parent.width-10) - element.width),
			 constrain(y, 0, (parent.height-50) - element.height)
		  ];
	   }
	});

	var mt = map.getMapTypes();
	for (var i=0; i<mt.length; i++) {
		mt[i].getMinimumResolution = function() {return 2;}
		mt[i].getMaximumResolution = function() {return 12;}
	}

	if($('zoomhome')) {
		zomehomefunc();
	}

	fans.each(function(e) {
		//map.addOverlay(e.marker);
		clusterer.AddMarker(e.marker,e.username);
	});

	var StadIcon = new GIcon();
	StadIcon.image = "http://i.holmesdale.net/selhurst/stad_icon.png";
	StadIcon.shadow = "http://i.holmesdale.net/selhurst/stad_icon_s.png";
	StadIcon.iconSize = new GSize(32, 36);
	StadIcon.shadowSize = new GSize(51, 36);
	StadIcon.iconAnchor = new GPoint(0, 15);
	StadIcon.infoWindowAnchor = new GPoint(0, 0);
	StadIcon.infoShadowAnchor = new GPoint(14, 25);

	var point = new GLatLng(51.397998,-0.085675);
	var stadium = new GMarker(point,StadIcon);
	clusterer.AddMarker(stadium,"Selhurst Park Stadium");
	//map.addOverlay(stadium);
}

Event.observe(window, 'load', function(e) {
	whereinit();

	Event.observe($('google'),'submit', function(e) {
		new Ajax.Request(
			'ajax/mapsearch.php?q='+encodeURIComponent($('googlesearch').value), {
				method: 'get',
				onSuccess: function(transport) {
					curpoint = transport.responseText.evalJSON(true);
					map.setCenter(new GLatLng(curpoint.Placemark[0].Point.coordinates[1], curpoint.Placemark[0].Point.coordinates[0]), 12);
				}
			}
		);
		Event.stop(e);
	});
});

Event.observe(window,'unload', function(e) {
	GUnload();
});

function HtmlControl($html, $options){
	this._html=$html;
	this.isVisible=true;
	this._isPrintable=false;	
	this._isSelectable=false;
	if($options){
		this.isVisible=($options.visible===false)?false:true;
		this._isPrintable=($options.printable===true)?true:false;
		this._isSelectable=($options.selectable===true)?true:false;
	}
	this.setVisible=function($bool){
		this._div.style.display=($bool)? 'block':'none';
		this.isVisible=$bool;
	};
}

HtmlControl.prototype=new GControl();

HtmlControl.prototype.initialize=function($map) {
	this.selectable=function() {
		return this._isSelectable;
	};
	this.printable=function() {
		return this._isPrintable;
	};
	this._div=document.createElement('div');
	this._div.innerHTML=this._html;
	this.setVisible(this.isVisible);
	$map.getContainer().appendChild(this._div);
	return this._div;
};

HtmlControl.prototype.getDefaultPosition=function(){
	return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(7,7));
};
