/* ***************************************************
 * 
 *  File:   map.js
 *
 *  Descr:  Front-end to Google MAP. Draws map based
 *          on KML and adds extra controls. 
 *
 *  Author: Jomar Hønsi, 2009
 *
 * **************************************************/
var map;
var spots=[];
var viewEnabled= 0;
var infoState= 0;
var icons= [];
var saved= new Object();
var sidebar= null;

var books= [
    {cnt:33, centre:0, zoom:13},
    {cnt:21, centre:44, zoom:9},
    {cnt:31, centre:56, zoom:7},
    {cnt:6,  centre:73, zoom:8},
];


function getValue(e) {
    var a= GXml.value(e);
    a= a.replace(/^\s*/,"");
  	a= a.replace(/\s*$/,"");
  	return a;
}

function focusOrder() {
	return 1;
}


function showFocus(spot) {
	spot.marker.setImage("http://maps.google.com/mapfiles/ms/micons/yellow-dot.png");
}


function hideFocus(spot) {
	spot.marker.setImage(spot.sturl);
}


function createMarker(spot) { 
	// Extract file name; use it as index into icon-array
	
	var i= spot.sturl.lastIndexOf("/");
	var url= spot.sturl.substr(i+1);
	// Create icon only once
	if ( icons[url]==null ) {
    	var icon= new GIcon(G_DEFAULT_ICON,spot.sturl);
		icon.iconSize=new GSize(32,32);
		icon.shadowSize=new GSize(56,32);
		icon.iconAnchor= new GPoint(18,30);
		icons[url]= icon;
	} else {
		icon= icons[url];
	}

	var marker = new GMarker(spot.point,{zIndexProcess:focusOrder,icon:icon} ); 

	// The marker click listener
	GEvent.addListener(marker, "click", function() {  
	        marker.show();
			xajax_showGeoItem(spot.i,spot.name);
			}); 
	// The marker "mouseover" listener        
	GEvent.addListener(marker,"mouseover", function() {
	  showInfo(spot);
	});        
	// The marker "mouseout" listener        
	GEvent.addListener(marker,"mouseout", function() {
	  hideInfo(spot);
	});

	// The marker "close infowindow" listener        
	GEvent.addListener(marker,"infowindowclose", function() {
	  infoState= 0;
	});
	
	return marker; 
}


function mapReset() {
    var center= new GLatLng(49.081062, 18.28125);
	hideFocus(spots[0]);
	map.setZoom(6);
	for (var i in spots ) {
		spots[i].marker.show();
	}
	map.setMapType(G_PHYSICAL_MAP);
	map.panTo(center);
	map.closeInfoWindow();
	infoState= 0;
}


function setMapProperties() {
	var center= new GLatLng(49.081062, 18.28125);
	map.enableScrollWheelZoom();
	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());
	map.addControl(new GOverviewMapControl());
	map.addMapType(G_PHYSICAL_MAP);
	map.removeMapType(G_SATELLITE_MAP);
	map.setCenter(center,6,G_PHYSICAL_MAP);
	//setTimeout("ov.setMapType(G_PHYSICAL_MAP);",1);
}

function createSideBar() {
	var j= 0;	// Index to books
	var book= books[j];
	var id= "sidebar1";
	sidebar= document.getElementById("sidebar1");
	var split= book.cnt;
	for (var i in spots) {
		spots[i].i= i;
		sidebar.innerHTML+= 
			'<a id="sb'+ i +'" class="sidebar" href="javascript:clickSideBar('+i+')" ' 
			+ ' onmouseover="showInfo(spots['+i+'])" onmouseout="hideInfo(spots['+i+'])">' 
			+ spots[i].name + '</a><br>';
		if (i==split-1) {
			document.getElementById(id).innerHTML += '<br>';
			j++;
			if (j==4)
				break;
			book= books[j];
			split+= book.cnt;
		}
		spots[i].book= j;

	}
}


function clickAsync(i,descr)
{
	var spot;
	spot= spots[i];

	spot.marker.openInfoWindowHtml('<h2>'+spot.name+'</h2>'
			+'<div class="ginfowin">' + descr
			+'</div>',{maxWidth:300, maxHeight:200}); 
}


function clickSideBar(i) {
	switch (infoState) {
	case 1:
		GEvent.trigger(spots[i].marker, "click");  
		infoState= 2;
		break;
	case 2:
		var j= spots[i].book;
		map.setZoom(books[j].zoom  + 2);
		infoState= 0;
		break;
	case 3:
		GEvent.trigger(spots[i].marker, "click");
		infoState= 2;
		break;
	default:
		spots[i].marker.closeInfoWindow();
		mapReset();
		infoState= 1;
		break;
	}
	var li= document.getElementById("clickinfo");
	li.innerHTML= jason.clickadvice[infoState];
}


function showInfo(spot) {

	var li= document.getElementById("info");
	li.innerHTML= spot.name; 
	li.innerHTML+= '<p id="clickinfo">' +  jason.clickadvice[infoState] + '</p>';
	saved.infoStyle= li.style.background;
	li.style.background= '#cc9 none';
	var sb= document.getElementById('sb'+spot.i);
	sb.style.color= 'white';
	sb.style.background= 'black';
	showFocus(spot);
}

function hideInfo(spot) {
	hideFocus(spot);
	var sb= document.getElementById('sb'+spot.i);
	sb.style.background='';
	sb.style.color='';
	infoState= 3;
	var li=  document.getElementById('info');
	li.innerHTML= '';
	li.style.background= saved.infoStyle;

}

function hideListing(v) {
	var li= document.getElementById("seznam");
	li.innerHTML= '';
}

function setElmValue(name,val,title)
{
	var li= document.getElementById(name);
	li.value= val;
	li.title= title;
}

function setHtml(name,val)
{
	var li= document.getElementById(name);
	li.innerHTML= val;
}

function setLanguage(ll)
{
	if (ll!=lang) {
		lang= ll;
		updateLanguage();
	}

}

process_init= function(doc) {
	jason = eval('(' + doc + ')');
  	for (var i in spots) {
		// spots[i].descr= '';
	}
}

process_update= function(doc) {
	jason = eval('(' + doc + ')');
  	for (var i in spots) {
		//spots[i].descr= '';
	}
	setElmValue("btnbk1",jason.book+' 1',jason.ttbook);
	setElmValue("btnbk2",jason.book+' 2',jason.ttbook);
	setElmValue("btnbk3",jason.book+' 3',jason.ttbook);
	setElmValue("btnbk4",jason.book+' 4',jason.ttbook);
	setElmValue("btnbk5",jason.reset,jason.ttreset);
	if (viewEnabled) {
		setElmValue("viewbutton",jason.dtHide,jason.ttdetails);
		showListing();
	} else {
		setElmValue("viewbutton",jason.dtShow,jason.ttdetails);
	}
	setHtml('flaginfo',jason.flag + flagurl);
	setHtml('sbheader',jason.sbheader);
	setHtml('shortstay',jason.shortstay);
	setHtml('longstay',jason.longstay);
}

function updateLanguage()
{
	GDownloadUrl(lang + "/lang.json", process_update);
}

function initLanguage()
{
	GDownloadUrl(lang + "/lang.json", process_init);
}

function showListing()
{
	xajax_showGeoList();
}

function toggleListView()
{
	viewEnabled= !viewEnabled;
	var btn= document.getElementById("viewbutton");
	if (viewEnabled) {
		showListing();
		btn.value=  jason.dtHide;
	} else {
		hideListing();
		btn.value= jason.dtShow;
	}
}


function showBook(n) 
{
	var book= books[n-1];
	var first= 0;
	for (var i=0; i<n-1; i++) {
		first+= books[i].cnt;
	}
	last= first+book.cnt;

	for (i=0; i<first; i++) {
		spots[i].marker.hide();
	}
	for (var i=last; i<spots.length; i++) {
		spots[i].marker.hide();
	}
	for (i=first; i<last; i++) {
		spots[i].marker.show();
	}
	//map.panTo(spots[book.centre].point);
	//var t= setTimeout("map.setZoom("+book.zoom+")",1000);
}


function MapInit(url) {

  if (GBrowserIsCompatible()) {
	initLanguage();
	map = new GMap2(document.getElementById("map"));
	setMapProperties(map);

	GDownloadUrl(url, function(data) {
		var xml = GXml.parse(data);
		var placemarks = xml.documentElement.getElementsByTagName("Placemark");
		var styles = xml.documentElement.getElementsByTagName("Style");

		// Create an array of point and line styles
		var starr= [];

		for (var i = 0; i < styles.length; i++) {
			var id= '#' + styles[i].getAttribute("id");
			var url= getValue(styles[i].getElementsByTagName('href')[0]);
			if (url) {
				starr[id]= url;
			} else {
				var t= new Object();
				var color= getValue(styles[i].getElementsByTagName('color')[0]);
				t.color= '#'+color.substr(6,2) + color.substr(4,2) + color.substr(2,2);
				t.width= parseInt(getValue(styles[i].getElementsByTagName('width')[0]));
				t.opacity= parseInt(color.substr(0,2),16) / 256.0;
				starr[id]= t;
			}
		}

		// Process placemarks
		for (var i = 0; i < placemarks.length; i++) {
			var coords=GXml.value(placemarks[i].getElementsByTagName("coordinates")[0]);

			// Get marker icon
		    var style= getValue(placemarks[i].getElementsByTagName("styleUrl")[0]);

			// Process points
			var points= placemarks[i].getElementsByTagName("Point");

			if (points.length>0) {
				var spot= new Object();
				
				spot.name= getValue(placemarks[i].getElementsByTagName("name")[0]);

				var coord = coords.split(",");
				spot.point= new GLatLng(parseFloat(coord[1]),parseFloat(coord[0]));

				// Get marker icon
				spot.sturl= starr[style];
				
				// Add placemark
				spot.marker= createMarker(spot);
				map.addOverlay(spot.marker);
				spots.push(spot);
			}

			// Process polylines
			var lines= placemarks[i].getElementsByTagName("LineString");

			if (lines.length>0) {
				var line= lines[0];
				var bits = coords.split(/\s+/);

				// Get line style
				var colour= starr[style].color;
				var width= starr[style].width;
				var opacity= starr[style].opacity;
				
				// Draw the polyline
	            var pts = [];
				bits.shift(); bits.pop();
         		for (var j= 0; j<bits.length; j++) {
					var coord= bits[j].split(",");
               		pts[j] = new GLatLng(parseFloat(coord[1]),parseFloat(coord[0]));
           		}
				
	            map.addOverlay(new GPolyline(pts,colour,width,opacity));
			}
			
		}
		// My stuff
		createSideBar();
		var li= document.getElementById("info");
		saved.infoStyle= li.style;
		fgShow();

	});

  }
}


