google.load("maps", "2.x");
var weatherJSON_Obj = '';
var servusTVMap;
var markerGroups = { "Wetter": [], "Events": []};

var epgMarkers = new Array();
var tourMarkers = new Array();
var map;

 $('#mapOptProgramInfo').live("click",function() {	
	if($('#mapOptProgramInfo').is(':checked')) {
		for(var i=0; i<epgMarkers.length; i++){
			epgMarkers[i].show();
		}
	}
	else {
		ew.hide();
		for(var i=0; i<epgMarkers.length ; i++){
			epgMarkers[i].hide();				
		}
	}
});

 $('#mapOptTours').live("click",function() {
	if($('#mapOptTours').is(':checked')) {
		for(var i=0; i<tourMarkers.length ; i++){
			tourMarkers[i].show();
		}
	}
	else {
		ew.hide()
		for(var i=0; i<tourMarkers.length ; i++){
			tourMarkers[i].hide();
		}
	}
});

$(function() {


	var centerPointLat = $('.centerPointLat').text();
	var centerPointLon = $('.centerPointLon').text();
	loadMap(centerPointLat, centerPointLon);
	document.getElementById('mapLoading').style.display="none";
	
	var eventScript = document.createElement('script');
	eventScript.type = 'text/javascript';
	eventScript.src = 'http://servustv.events.at/mapdata_json.php';
	document.getElementsByTagName('head')[0].appendChild(eventScript);  
	
	var searchScript = document.createElement('script');
	searchScript.type = 'text/javascript';
	searchScript.src = 'http://www.google.com/uds/solutions/localsearch/gmlocalsearch.js';
	document.getElementsByTagName('head')[0].appendChild(searchScript);
	$('#mapOptEvents').live("click",function() {				
		if($('#mapOptEvents').is(':checked')) {
			if(markerGroups['Events'].length==0)
				servusTV_EventMapObj.init();
			else
				toggleMarkerView('Events');
		} else {
			toggleMarkerView('Events');
		}
	});
});

var servusTV_EventMapObj = {
	markerOptions: null,
	init: function() {
		_eventMapObj = servusTV_EventMapObj;
		_eventOverlay = event_Calendar_Overlay;
		_eventOverlay.init();
		_eventMapObj.markerOptions = _eventMapObj.createMarkerOptions();
		_eventMapObj.generateEventMarkersFromJSON();
		$('.mapContainer').find('.eventProgramDetails ul li a[class!="close"], .mapEventDetails a[class!="close"], .suggestEvent, .cropEventTeaser a').live('click', _eventMapObj.openEventOverlay);
		$('.map').find('.eventProgramInfoPopUp, .programInfoPopUp').live('mouseover',_eventMapObj.disableScrollZoom);
		$('.map').find('.eventProgramInfoPopUp, .programInfoPopUp').live('mouseout',_eventMapObj.enableScrollZoom);
	},
	
	generateEventMarkersFromJSON: function() {
		var eventJSONData = servusTVEvent_JSON_Obj['events'];
		var mapSpace = new GLatLngBounds;
		_eventMapObj.mapSpace = mapSpace;
		$.each(eventJSONData, function(eventKey, eventValue) {
			if(eventValue.lat!="" && eventValue.lon!="") {
				var marker_Point = new GLatLng(eventValue.lat,eventValue.lon);
				var overlay_HTML = _eventMapObj.createHTMLForMarkerInfo(eventValue.type,eventValue.title,eventValue.text,eventValue.image_url);
				var marker = _eventMapObj.createMarker(marker_Point,overlay_HTML);
				servusTVMap.addOverlay(marker);
			}
		});
	},
	
	createMarkerOptions: function() {
		var eventIcon = new GIcon(G_DEFAULT_ICON);
        eventIcon.image = STVWEBROOT+"images/event_Icon_Big.png";
        eventIcon.iconSize = new GSize(14, 26);
        eventIcon.shadow = STVWEBROOT+"images/event_Icon_Big_Shadow.png";
        eventIcon.shadowSize = new GSize(32, 26);
        eventIcon.imageMap = [ 10,29, 1,16, 0,5, 5,0, 12,4, 18,2, 21,12, 21,16 ]; 
        var eventMarkerOptions = { icon:eventIcon };
        
        return eventMarkerOptions;
	},
	
	createMarker: function(marker_Point,overlay_HTML) {
		var marker = new GMarker(marker_Point, _eventMapObj.markerOptions);
		markerGroups['Events'].push(marker);
		_eventMapObj.mapSpace.extend(marker.getLatLng());
        // ========== Open the EWindow instead of a Google Info Window ==========
        GEvent.addListener(marker, "click", function() {
			servusTVMap.setCenter(marker_Point);
            ew.openOnMarker(marker, overlay_HTML);
        });
        
        return marker;
	},
	
	openEventOverlay: function() {
		_eventOverlay.createIframe($(this).attr('href'));
		return false;
	},
	
	disableScrollZoom: function() {
		servusTVMap.disableScrollWheelZoom();
		servusTVMap.disableDragging()
	},
	
	enableScrollZoom: function() {
		servusTVMap.enableScrollWheelZoom();
		servusTVMap.enableDragging()
	},
	
	createHTMLForMarkerInfo: function(eventType,eventTitle,eventText,event_Image_URL) {
		if(eventType=="location") {
			var HTML = "<ul class='mapEventLocation'><li>Veranstaltungen | </li><li class='eventLocationLbl'>"+eventTitle+"</li></ul><div class='programDetails'><div class='eventProgramDetails eventLinkCont'>"+eventText+"</div><a class='suggestEvent' href='http://servustv.events.at/add_event.php'>Neue Veranstaltung eintragen</a><a class='close' href='javascript:ew.hide()'>schließen</a></div>";
		} else {
			var eventDetailURL = $($(eventText).find('strong')[0]).parent().attr('href');
			var HTML = "<div class='cropEventTeaser'>";
				if(event_Image_URL) {
					HTML += "<a href="+eventDetailURL+" class='mapEventTitle'><img src="+event_Image_URL+" alt="+eventTitle+" /></a>";
				}
				HTML += "</div>";
				HTML +=	"<div class='mapEventDetails eventLinkCont'>"+eventText+"<a href="+eventDetailURL+" class='mapEventTitle'>"+eventTitle+"</a><a class='suggestEvent' href='http://servustv.events.at/add_event.php'>Neue Veranstaltung eintragen</a><a class='close' href='javascript:ew.hide()'>schließen</a></div>";
		}
        
        return HTML;
	}
};

function loadMap(centerPointLat, centerPointLon){	
    
    var init = function() {
  
		map = createGoogleMap();
		servusTVMap = map;

		$('#mapOptWeather').live("click",function() {				
			if($('#mapOptWeather').is(':checked')) {
				
				if(markerGroups['Wetter'].length==0) {
					if(weatherJSON_Data != ''){
						weatherJSON_Obj = eval('('+weatherJSON_Data+')');
					}
				}
				else{
					toggleMarkerView('Wetter');
				}
				generateWeatherMarkersFromJSON(map);
			}
			else{
				ew.hide();
				toggleMarkerView('Wetter');			
			}
		});
		/* Weather Code ends here */
		
		if(ServusTVMapInfo) {

            	var editorialMarkerOptions= createMarkerOptions('editorial');
            	var epgMarkerOptions= createMarkerOptions('epg');
				
            	generateMarkersFromJSON(map, editorialMarkerOptions, 'editorial');
				generateMarkersFromJSON(map, epgMarkerOptions, 'epg');

				for(var i=0; i<epgMarkers.length ; i++){
					map.addOverlay(epgMarkers[i]);
					epgMarkers[i].hide();
				}
				for(var i=0; i<tourMarkers.length ; i++){
					map.addOverlay(tourMarkers[i]);
					tourMarkers[i].hide();
				}
            if($('#mapOptProgramInfo').attr('checked')){
				for(var i=0; i<epgMarkers.length ; i++){
					epgMarkers[i].show();
				}
			}
            if($('#mapOptTours').attr('checked')){
				for(var i=0; i<tourMarkers.length ; i++){
					tourMarkers[i].show();
				}
			}
            if($('#mapOptWeather').attr('checked')){
				if(markerGroups['Wetter'].length==0) {
					if(weatherJSON_Data != ''){
						weatherJSON_Obj = eval('('+weatherJSON_Data+')');
					}
				}else{
					toggleMarkerView('Wetter');
				}
				generateWeatherMarkersFromJSON(map);
			}
 
	}
        
    };
    
    var createGoogleMap = function() {
        
        var map = new GMap2($(".mapContainer").get(0));
        var centerPoint = new GLatLng(centerPointLat,centerPointLon);
        map.setCenter(centerPoint, 7);
        map.addControl(new GLargeMapControl());
        map.setMapType(G_PHYSICAL_MAP);
        map.enableScrollWheelZoom();
        
        // Create an EWindow
        ew = new EWindow(map, E_STYLE_7);      
        map.addOverlay(ew);
        return map;
    };
	
     var createMarkerOptions = function(optionsType) {
        
        var myIcon = new GIcon(G_DEFAULT_ICON);
	 if(optionsType == 'epg'){
	 	myIcon.image = STVWEBROOT+"images/icon_mapsMain.png";
        myIcon.shadow = STVWEBROOT+"images/icon_mapsMainShadow.png";		
	 }else if(optionsType == 'editorial'){
		myIcon.image = STVWEBROOT+"images/dateMap.png";
        myIcon.shadow = STVWEBROOT+"images/tour_Icon_Big_Shadow.png";		
	 }
        myIcon.iconSize = new GSize(24, 30);

        myIcon.shadowSize = new GSize(41, 30);
        myIcon.imageMap = [ 10,29, 1,16, 0,5, 5,0, 12,4, 18,2, 21,12, 21,16 ]; 
        var markerOptions = { icon:myIcon };
        
        return markerOptions;
    };
    
    var generateMarkersFromJSON = function(map, markerOptions, markerType) {
	if(markerType == 'editorial'){
	var EditorialJSONData = ServusTVMapInfo.editorialArticles;

	var adaPoint = new GLatLng(centerPointLat, centerPointLon);
	for(var i = 0; i<EditorialJSONData.length; i++)
        {
            var point = new GLatLng(EditorialJSONData[i].xLat,EditorialJSONData[i].yLon);
	     
            		var html = createHTMLForMapInfo(
                		EditorialJSONData [i].articleUrl,
                		EditorialJSONData [i].programImageSrc,
				EditorialJSONData [i].videoUrl,
                		EditorialJSONData [i].programImageAlt,
                		EditorialJSONData [i].programTime,
                		EditorialJSONData [i].programTitle,
				EditorialJSONData [i].programSubTitle,
                		EditorialJSONData [i].programType,
                		EditorialJSONData [i].programRunningTime, 
				markerType);
            			var marker = createMarker(point,html, map, markerOptions);
            			tourMarkers.push(marker);

            }
	}else if(markerType == 'epg'){
	var EPGJSONData = ServusTVMapInfo.epgArticles;

	for(var i = 0; i<EPGJSONData.length; i++)
        {
            var point = new GLatLng(EPGJSONData[i].xLat,EPGJSONData[i].yLon);

            		var html = createHTMLForMapInfo(
                		EPGJSONData[i].articleUrl,
                		EPGJSONData[i].programImageSrc,
				EPGJSONData[i].videoUrl,
                		EPGJSONData[i].programImageAlt,
                		EPGJSONData[i].programTime,
                		EPGJSONData[i].programTitle,
				EPGJSONData[i].programSubTitle,
                		EPGJSONData[i].programType,
                		EPGJSONData[i].programRunningTime,
				markerType);
            			var marker = createMarker(point,html, map, markerOptions);
            			epgMarkers.push(marker);

            }

       }
    }; 
    
    var createMarker = function(point,html, map, markerOptions) {
        
        var marker = new GMarker(point, markerOptions);
        
        // ========== Open the EWindow instead of a Google Info Window ==========
        GEvent.addListener(marker, "click", function() {
            map.setCenter(point);
            ew.openOnMarker(marker, html);
        });
        
        return marker;
    };
    
    var createHTMLForMapInfo = function(articleUrl, programImageSrc, videoUrl ,programImageAlt, programTime, programTitle, programSubTitle, programType, programRunningTime, markerType) {
        
        var HTML = "<div class='cropEventTeaser'>";
	 if(videoUrl == ""){
	 	HTML += "<a href=\""+articleUrl+"\"><img src='"+programImageSrc+"' alt='"+programImageAlt+"' class='imgMapTeaserSize'/></a></div>";
	 }else{
	 	HTML += "<a href=\""+videoUrl+"\" class=\"playControl\"><img src='"+programImageSrc+"' alt='"+programImageAlt+"' class='imgMapTeaserSize'/><span class='playButton mapPlay'/></span></a></div>";
	 }
        HTML += "<div class='programDetails'>";
        HTML += "<span class='programTime'>"+programTime+"</span>";
        HTML += "<span class='programTitle'><a href=\""+articleUrl+"\">"+programTitle+"</a></span>";
	 HTML += "<span class='programSubTitle'><a href=\""+articleUrl+"\">"+programSubTitle+"</a></span>";
        HTML += "<span class='genreYear'>"+programType+"</span>";
        HTML += "<a href='javascript:ew.hide()' class='close'>schlie&szlig;en</a>";
        HTML += "</div>";
        
        return HTML;
        
    };
	
	
    
    init();

}
var getWeatherLonLat = function() {
		var weatherLatLonObjStr = '{"weatherLatLonArr":[';
		$.each(weatherJSON_Obj, function(key, value) {
					 
			  weatherLatLonObjStr += '{\"lon\":'+value.lon.toString()+',\"lat\":'+value.lat.toString()+',';			 
			  weatherLatLonObjStr += '\"tx\":'+value.i.tx.toString()+',\"tn\":'+value.i.tn.toString()+',\"symbol\":\"'+value.i.symbol.toString()+'\"},';
		});
		var weatherLatLonObjStrLength = weatherLatLonObjStr.length;
		if(weatherLatLonObjStrLength > 25){
			weatherLatLonObjStr = weatherLatLonObjStr.substr(0,weatherLatLonObjStr.length-1);
		}
		weatherLatLonObjStr += ']}';
		var weatherLatLonObj = eval('('+weatherLatLonObjStr+')');
		return weatherLatLonObj;
	};
function toggleMarkerView(opt) {	
	for (var i = 0; i < markerGroups[opt].length; i++) {
		var marker = markerGroups[opt][i];		
		if (marker.isHidden()) {
          marker.show();
        } else {
          marker.hide();
		  ew.hide();

        }
	} 
};


 var createWeatherMarker = function(point,html,map, markerOptions) {
       
       var marker = new GMarker(point, markerOptions);

	markerGroups['Wetter'].push(marker);
 // ========== Open the EWindow instead of a Google Info Window ==========
        GEvent.addListener(marker, "click", function() {
            map.setCenter(point);
            ew.openOnMarker(marker, html);
        });

        return marker;
    };
	
	 var createWeatherMarkerOptions = function(imgName) {
        
        var myIcon = new GIcon(G_DEFAULT_ICON);
        myIcon.image = STVWEBROOT+"images/"+imgName+".png";
		
		if (imgName == "sonne_kleine_wolke_blitz" || imgName == "sonne_kleine_wolke"){
		  myIcon.imageMap = [ 12,27,8,22,5,16,5,9,9,4,15,4,20,8,23,14,29,17,35,22,30,27,21,28 ]; 

		 }
		 else if(imgName.substring(0,6) == "sonne_" || imgName.substring(0,8) == "gewitter") {		
			//myIcon.imageMap = [ 21,43,16,40,16,37,12,33,12,29,10,26,10,24,10,19,12,15,15,10,19,7,25,8,28,10,38,6,44,5,54,10,57,15,65,12,69,12,73,17,77,22,81,24,85,25,88,34,84,40,81,44,46,44,23,43 ]; 
			myIcon.imageMap = [14,27,9,23,6,17,5,13,5,7,8,4,14,4,17,4,22,5,28,1,40,7,49,12,55,14,56,26,26,27,14,28];
		 }
		 
		 else if (imgName == "sonne"){
		  myIcon.imageMap = [ 21,25,20,17,23,12,30,9,36,13,40,20,37,30,23,29 ]; 

		 }
		
		  else if (imgName == "dunkle_wolke" || imgName == "helle_wolke"){
		  myIcon.imageMap = [ 8,23,13,17,16,5,23,-1,20,1,31,4,42,5,41,9,55,11,58,25,56,21,54,27,26,27,9,27 ]; 

		 }	
		   else if (imgName.substring(0,13) == "dunkle_wolke_"){
		  myIcon.imageMap = [ 12,3,23,5,39,5,55,4,52,11,47,22,38,28,27,23,20,21,17,15,10,12,9,6 ]; 

		 }	
		 else if (imgName == "nebel"){
		  myIcon.imageMap = [ 7,24,18,23,18,18,13,15,16,11,24,12,28,15,30,19,42,17,49,17,46,23,39,26,12,27 ]; 

		 }	
		  else if (imgName == "nebel_achtung"){
		  myIcon.imageMap = [ 7,24,15,22,19,18,12,15,13,12,21,13,29,14,34,4,39,4,44,12,49,21,41,23,37,26,23,27,8,27 ]; 

		 }	
		  else if (imgName == "sonne_nebel"){
		  myIcon.imageMap = [ 11,21,4,12,5,4,16,0,20,3,24,10,27,14,39,14,49,13,47,18,39,21,23,23,13,22 ]; 

		 }	
		 
		 else {
		 myIcon.imageMap = [ 10,29,1,16,0,5,5,0,12,4,18,2,21,12,21,16 ]; 

		 }
		
		myIcon.shadow = null;
        myIcon.iconSize = new GSize(60, 38);
        var markerOptions = { icon:myIcon,shadow:false };       
        return markerOptions;
    };
	
	var createHTMLForWeatherInfo = function(maxTemp, minTemp) {
        
       var HTML = "<div class='weatherEventDetails'>";
        HTML += "<span>H&ouml;chstwerte: " + maxTemp +"&deg;C</span>";
	 HTML += "<span>Tiefstwerte: " + minTemp +"&deg;C</span>";
        HTML += "<a href='javascript:ew.hide()' class='close'>schlie&szlig;en</a>";
        HTML += "</div>";
        
        return HTML;
        
    };

	var generateWeatherMarkersFromJSON = function(map) {
	var JSONData = getWeatherLonLat();
	var markerOptions;
	
	for(var i = 0; i<JSONData.weatherLatLonArr.length; i++)
        {
            var point = new GLatLng(JSONData.weatherLatLonArr[i].lat,JSONData.weatherLatLonArr[i].lon);    
				markerOptions=createWeatherMarkerOptions(JSONData.weatherLatLonArr[i].symbol);
				var html = createHTMLForWeatherInfo(
                		JSONData.weatherLatLonArr[i].tx,
                		JSONData.weatherLatLonArr[i].tn);
            			var marker = createWeatherMarker(point,html, map, markerOptions);

            			map.addOverlay(marker);
        
            }
        
    };
