
    // Configuration
    // ---------------------------------------------------------------------
    var szTilePath = "tiles/";
    var szTileExt = ".png";

	var szTimeServer = "time.php";
    var szClickHandler = "click.php";
    
  	var szYaleInfo = "yale.php";
   	var szHipparcosInfo = "hipparcos.php";
    
    var iZoomDefault = 2;
	var iMaxZoom = 6;
	

	// Global Variables
    // ---------------------------------------------------------------------
	
	// The Map
	var map;
	
	// Copyright & Copyright Collection
	var cpDefault;
	var ccDefault;
	
	// Tile Layer
	var tlThis;
	
	// Map Type
	var mtThis;
	
	// Overview Map & Overview Map Control
	var ovcontrol;
    var ovmap;

	// Current Server Time
	var iCurrentTime = 0;
	
	// Current Mouse Position & Timer for PopUp
	var llCurrentPos = new GLatLng(0, 0);
	var pCurrentPoint = new GPoint(0, 0);
	var iTimerID = 0;
	var iLastAction = 0;
	var bWindow = false;
	
    
    // AJAX Functions
    // ---------------------------------------------------------------------
    
    var req;
	
	function loadXMLDoc(url) 
	{
	    // branch for native XMLHttpRequest object
	    if (window.XMLHttpRequest) {
	        req = new XMLHttpRequest();
	        req.onreadystatechange = processReqChange;
	        req.open("GET", url, true);
	        req.send(null);
	    // branch for IE/Windows ActiveX version
	    } else if (window.ActiveXObject) {
	        req = new ActiveXObject("Microsoft.XMLHTTP");
	        if (req) {
	            req.onreadystatechange = processReqChange;
	            req.open("GET", url, true);
	            req.send();
	        }
	    }
	}
	
	function processReqChange() 
	{
	    // only if req shows "complete"
	    if (req.readyState == 4) {
	        // only if "OK"
	        if (req.status == 200) {
	            // ...processing statements go here...
	            processResponse(req.responseXML);
	        } else {
	            alert("There was a problem retrieving the XML data:\n" + req.statusText);
	        }
	    }
	}
	
	function processResponse(xmlDoc)
	{
		var root = xmlDoc.documentElement;
		var request = root.getElementsByTagName('request')[0].firstChild.data;
		
		if(request == 0)
		{
			var found = root.getElementsByTagName('found')[0].firstChild.data;
			if(found == 1)
			{
				var type = root.getElementsByTagName('type')[0].firstChild.data;
				var hr = root.getElementsByTagName('hr')[0].firstChild.data;
				var hd = root.getElementsByTagName('hd')[0].firstChild.data;
				var ra = root.getElementsByTagName('ra')[0].firstChild.data;
				var dec = root.getElementsByTagName('dec')[0].firstChild.data;
				
				showPopUp(type, hr, hd, ra, dec);
			}
		}
		else if(request == 1)
		{
			var time = root.getElementsByTagName('time')[0].firstChild.data;
			updateMap(time);
		}
	}
	    
	
	// Update Timer Functions
    // ---------------------------------------------------------------------  
    	
    function refreshTime()
    {
	   	loadXMLDoc(szTimeServer);
    }
    
    function updateMap(time)
    {
    	iCurrentTime = time;
		map.zoomIn();
		map.zoomOut();
    }
    
    
    // Mouse Hover Timer Functions
	// ---------------------------------------------------------------------    
    
    function resetTimer()
    {
    	if(iTimerID)
    		window.clearTimeout(iTimerID);
    		
    	iTimerID = window.setTimeout("exexcuteTimer()", 300);	
    }
    
    function exexcuteTimer()
    {
		var temp = new GMercatorProjection(iMaxZoom + 1);
		pCurrentPoint = temp.fromLatLngToPixel(llCurrentPos,  map.getZoom());

		//self.status = "?X=" + pCurrentPoint.x + "&Y=" + pCurrentPoint.y + "&Z=" + map.getZoom() + "&T=" + iCurrentTime;
	    loadXMLDoc(szClickHandler + "?X=" + pCurrentPoint.x + "&Y=" + pCurrentPoint.y + "&Z=" + map.getZoom() + "&T=" + iCurrentTime);
    }

	function showPopUp(type, hr, hd, ra, dec)
    {
	    if(iLastAction == 0)
	    	return;
	    	
	    if(iLastAction == 1)
	    {
	    	map.openInfoWindowHtml(llCurrentPos, "Star Position:<br />&nbsp;<br />RA: " + ra + ", " + "DEC: " + dec);
	    	bWindow = true;
    	}
	    else
	    {
			map.openInfoWindowHtml(llCurrentPos, "Star Data:<br />&nbsp;<br /><a href=\"" + szHipparcosInfo + "?id=" + hd + "\">Look up Hipparcos catalog</a><br /><a href=\"" + szYaleInfo + "?id=" + hr + "\">Look up Yale Bright Star catalog</a>");	    	
	    	bWindow = true;
	    }
    }
        
    
    // Initialization
    // ---------------------------------------------------------------------

	function startGoogleMaps()
    {
      if(GBrowserIsCompatible())
      {
        map = new GMap2(document.getElementById("map"));
        
    	ccDefault = new GCopyrightCollection("");

		cpDefault = new GCopyright(1, new GLatLngBounds( new GLatLng(-90, -180), new GLatLng(90, 180)), 0, "Copyright (C) 2007 Jürgen Treml");
    	ccDefault.addCopyright(cpDefault);

    	tlThis = [new GTileLayer(ccDefault, 0, iMaxZoom)];
    	tlThis[0].getTileUrl = function customMapGetTileUrl(t, z)
    	{
        	return szTilePath + iCurrentTime + "/" + z + "/" + t.y + "_" + t.x + szTileExt;
    	};
    
    	mtThis = new GMapType(tlThis, new GMercatorProjection(iMaxZoom + 1), "Ciclope", {errorMessage:"No data available"});
        
        map.addMapType(mtThis);
        map.addControl(new GLargeMapControl());
        //map.enableDoubleClickZoom();
        //map.enableContinuousZoom();
        
       	GEvent.addListener(map, "click", function(marker, point)
        {
	        iLastAction = 2;
	        
			var temp = new GMercatorProjection(iMaxZoom + 1);
			var pixel = temp.fromLatLngToPixel(point,  map.getZoom());

			//alert(szClickHandler + "?X=" + pixel.x + "&Y=" + pixel.y + "&Z=" + map.getZoom() + "&T=" + iCurrentTime);
			loadXMLDoc(szClickHandler + "?X=" + pixel.x + "&Y=" + pixel.y + "&Z=" + map.getZoom() + "&T=" + iCurrentTime);
		});
		
		/*
		GEvent.addListener(map, "dblclick", function(marker, point) {
			map.setCenter(point, map.getZoom() + 1);
		});
		*/
		
		GEvent.addListener(map, "mousemove", function(latlon)
        {
	        if(bWindow)
	        {
	        	if(iLastAction == 2 && map.getInfoWindow().isHidden() == false)
	        		return;
	        		
	        	bWindow = false;
	        	map.getInfoWindow().hide();
	        }
	        
	        llCurrentPos = latlon;
	        iLastAction = 1;
	        
			resetTimer();
		});
		
		GEvent.addListener(map, "mouseout", function(latlon)
        {
	        llCurrentPos = new GLatLng(0, 0);
	        iLastAction = 0;
	
			if(iTimerID)
				window.clearTimeout(iTimerID);
		});
		
		map.setCenter(new GLatLng(0, 0), iZoomDefault, mtThis);
		
		// Add Overview Map
		ovcontrol = new GOverviewMapControl(new GSize(200,200));
		map.addControl(ovcontrol);
		ovmap = ovcontrol.getOverviewMap();
		
		// Start the Update Timer
		window.setInterval("refreshTime()", 60000);
		
		// Atttention: This statement causes some javascript error, nevertheless it works
		try
		{
			ovmap.setMapType(mtThis);
		}
		catch(err){}
		
		refreshTime();        
      }
    }
	
    
    // GWT Specific
    // ---------------------------------------------------------------------
    
    function scriptLoaded(){}