
// ========= GOOGLE MAPS ACK, er HACK =========== 

// ========= routeMap class ========= 

var routeMap = {
  map: null,
  latlngbounds: new google.maps.LatLngBounds(),
  gStops: [],
  gMarkers: [],
  gLines: [],
  gTratte: []
};
// ==================================
// ==== Translate Marker Titles =====
// ==================================
function i18nTitle (lang, title) {
    switch (lang) {
        case "en": 
           var translated = title + " Stop";
        break;
        case "it":
        default:
            var translated = "Fermata " + title;
        break;
        case "es":
            var translated = "Parada " + title;
        break;
        case "fr":
            var translated = "Arr&#234;t" + title;
        break;
    };
    return new String(translated);
}
// ==================================
// ========= Custom Icons =========== 
// ==================================
var customIcons = [];

function loadIcons(route){
    for ( i = 1; i < 16; i++ ) {
	   customIcons["fermata" + i] = ({
		  icon: "/img/" + route + "/icons/gmap-" + i + ".png",
		  shadow: "/img/icons/gmap-shadow.png"
	   });
    };
    customIcons["placemark"] = ({
	   icon: "/img/icons/placemark.png",
	   shadow: "/img/icons/placemark-shadow.png"
    });
    return customIcons;
}

// ==================================
// ===== Helper x Fancy box      ====
// ===== get Marker descriptions ====
// ==================================
function fancyboxDesc(xml, markerID, lang){
	var descText = "";
	var getMarker = $(xml).find("[markerID='" + markerID + "']");
	descText = $(getMarker).find("description[lang='" + lang + "']").text();

	return new String(descText);	
}
// ==================================
// ===== Helper x Tab toggling   ====
// ==================================
routeMap.tabToggleLines = function (tabSelector, ui) {

    var percorsoSelected = $("#fermate ul li.ui-tabs-selected").find("a").attr("href").replace("#", "");
    var fermataSelected = $(".fermate-list ul li.ui-tabs-selected").find("a").attr("href").replace("#", "");
        
    switch(tabSelector){
        case "percorso":
        default:
            var fermataTab = fermataSelected;
            var oldPercorsoTab = percorsoSelected;
            var percorsoTab = ui.tab.hash.replace("#", "");
            if (oldPercorsoTab !== percorsoTab){
                routeMap.togglePercorso(oldPercorsoTab, percorsoTab, fermataTab);
            }
        break;
        case "fermata":
            var percorsoTab = percorsoSelected;
            var oldFermataTab = fermataSelected;
            var fermataTab = ui.tab.hash.replace("#", "");
            var fermataClass = $(ui.tab).attr("class");
            switch(fermataTab){
                case "colosseo":
                case "navona":
                    if (fermataTab !== fermataClass){
                        fermataTab = fermataClass;
                    }
                break;
                default:
                break; 
            }
            if (oldFermataTab !== fermataTab){
                if(oldFermataTab == "termini2"){
                     routeMap.createLine( routeMap.mapLines[percorsoTab][fermataTab], "tratta", percorsoTab, fermataTab );
                    routeMap.toggleMarker(true, percorsoTab, "fermata", "termini1");
                    routeMap.toggleMarker(false, percorsoTab, "fermata", "termini2");
                }else if (fermataTab == "termini2"){
                    routeMap.deleteLine("tratta");                 
                    routeMap.toggleMarker(false, percorsoTab, "fermata", "termini1");
                    routeMap.toggleMarker(true, percorsoTab, "fermata", "termini2");
                }else {
                    routeMap.toggleTratta(oldFermataTab, fermataTab, percorsoTab);
                }
            }      
        break;
    }                           
}

// ==================================
// ===== Recenter & Zoom Map ========
// ==================================
routeMap.zoomIt = function(latlng, zoomTo) {

    if(zoomTo == "marker"){
        routeMap.map.setCenter(routeMap.initCenter);
        routeMap.map.setZoom(routeMap.initZoom);
        return routeMap.map;
    } else {
        routeMap.latlngbounds = new google.maps.LatLngBounds();
        if(zoomTo == "percorso"){
            routeMap.map.setCenter(routeMap.initCenter);
            routeMap.map.setZoom(routeMap.initZoom);
            
        }
        if ($.isArray(latlng) ) {
            for ( key in latlng ) {
                routeMap.latlngbounds.extend(latlng[key]);
            };
        } else {
            routeMap.latlngbounds.extend(latlng);
        }  
        
        routeMap.map.setCenter(routeMap.latlngbounds.getCenter());
        if(zoomTo == "tratta"){
            routeMap.map.fitBounds(routeMap.latlngbounds);
        } else {
            routeMap.map.panToBounds(routeMap.latlngbounds);
        }
        return routeMap.map;
    }
}

// ==================================
// ========= Load Fermate ===========
// ==================================
routeMap.loadFermate = function(xml, lang) {

	var allFermate =  [];

	$(xml).find("percorso").each(function(){
            var percorsoName = $(this).attr("percorsoID");   
            allFermate[percorsoName] = [];         
            $(this).children("fermate").each(function(){ 
                var markerName = $(this).text();
                var markerIcon = "fermata" + $(this).attr("id");
                var markerTitle = new i18nTitle(lang, $(xml).find("fermata[markerID='" + markerName + "']").attr("title") );
                var markerPoint = new google.maps.LatLng(
                    parseFloat( $(xml).find("fermata[markerID='" + markerName + "']").attr("lat")),
                    parseFloat( $(xml).find("fermata[markerID='" + markerName + "']").attr("lng"))
                );

                allFermate[percorsoName][markerName] = ({
                    type:           "fermata",
                    percorsoID: 	percorsoName,	
                    markerID:       markerName,
                    iconType:       markerIcon,
                    visible:        false,                    
                    tooltip: 		markerTitle,
                    point:          markerPoint
                });
                routeMap.createMarker (allFermate[percorsoName][markerName]);
            });
            
    });
	return allFermate;
}
// ==================================
// ========== Create Marker =========
// ==================================
routeMap.createMarker = function( markerInfo ){	
	var iconName = markerInfo.iconType;
	var iconImg = customIcons[iconName] || customIcons["placemark"];
    
	var marker = new google.maps.Marker({
		map: routeMap.map,
		position: markerInfo.point,
		icon: iconImg.icon,
		shadow: iconImg.shadow,
        visible: markerInfo.visible,
		title: String( markerInfo.tooltip ),
        clickable: false
    });
    marker.type = markerInfo.type;
    if(marker.type == "monumento") {
    	marker.fermata = markerInfo.fermata;
		marker.setVisible(true);
   	} else {
   	    marker.percorsoID = markerInfo.percorsoID;
        marker.markerID = markerInfo.markerID;
   	}

	if(marker.type == "monumento") {
		routeMap.gMarkers.push(marker);
	} else {
	   routeMap.gStops.push(marker);
	}
 
	return marker;
}

// ==================================  
// == Toggle Stops based on Route ===
// ==================================  
routeMap.toggleStops = function(opt_enable, percorsoID) {
  if (typeof opt_enable == "undefined") {
    opt_enable = !routeMap.gStops[0].getMap();
  }
  for (var n = 0, marker; marker = routeMap.gStops[n]; n++) {
    if (marker.percorsoID == percorsoID) {
        marker.setVisible(opt_enable);
        routeMap.gStops[n].setVisible(opt_enable);
        if(opt_enable == true){
            routeMap.zoomIt(routeMap.gStops[n].position, "percorso");   
        }
    }
  }
}
// ==================================  
// ===== Toggle Single Markers ======
// ==================================  
routeMap.toggleMarker = function(opt_enable, percorsoID, markerType, markerID) {
  if (typeof opt_enable == "undefined") {
    switch(markerType){
        case "fermata":
        default:
            opt_enable = !routeMap.gStops[0].getMap();
        break;
        case "monumento":
            opt_enable = !routeMap.gMarkers[0].getMap();
        break;
    }    
  }
    switch(markerType){
        case "fermata":
        default:
            markerArray = routeMap.gStops;
        break;
        case "monumento":
            markerArray = routeMap.gMarkers;
        break;
    }   
  for (var n = 0, marker; marker = markerArray[n]; n++) {
    if (marker.markerID == markerID) {
        if (marker.percorsoID == percorsoID) {
            marker.setVisible(opt_enable);
            if(opt_enable){
                routeMap.zoomIt(marker.position, "percorso");
            }
        }
    }
  }
}
// ==================================  
// ===== Load Percorso & Tratte =====
// ==================================  
routeMap.loadLines = function(xml) {
	var allLines = new Array();
	$(xml).find("percorso").each(function(){
		var percorso = $(this).attr("percorsoID");
		var percorsoColor = $(this).attr("color");
		var percorsoWidth  = parseFloat( $(this).attr("width") );
		var percorsoOpacity  = parseFloat( $(this).attr("opacity") );
		var i = 0;
		var percorsoPts = new Array();
		$(this).find("point").each(function(){
			percorsoPts[i] = new google.maps.LatLng(
				parseFloat( $(this).attr("lat") ),
				parseFloat( $(this).attr("lng") )
			);
			i++;				  
		});
		allLines[percorso] = {
            percorsoID: percorso,
			color: percorsoColor,
			width: percorsoWidth,
			opacity: percorsoOpacity,
            zIndex: 0,
			pts: percorsoPts  
		};
		//get tratte del percorso
		$(xml).find("tratta[percorso='" + percorso + "']").each(function(){
			var tratta = $(this).attr("lineID");
			var trattaColor = $(this).attr("color");
			var trattaWidth  = parseFloat( $(this).attr("width") );
			var trattaOpacity  = parseFloat( $(this).attr("opacity") );
			var i = 0;
			var trattaPts = new Array();
			$(this).find("point").each(function(){
				trattaPts[i] = new google.maps.LatLng(
					parseFloat( $(this).attr("lat") ),
					parseFloat( $(this).attr("lng") )
				);
				i++;
				
				allLines[percorso][tratta] = {
				    trattaID: tratta,
				    percorsoID: percorso,
					color: trattaColor,
            		width: trattaWidth,
            		opacity: trattaOpacity,
                    zIndex: 1,
            		pts: trattaPts
				};
			});
		});
	});
	return allLines;
 }
// ==================================  
// ====== Create Lines ==============
// ==================================  
routeMap.createLine = function (lineInfo, lineType, percorsoID, trattaID){
    
	var line = new google.maps.Polyline({
		map: routeMap.map,
		path: lineInfo.pts,
		strokeColor: lineInfo.color,
		strokeOpacity: lineInfo.opacity,
        zIndex: lineInfo.zIndex,
		strokeWeight: lineInfo.width
	});	
   
    switch (lineType){
        case "percorso":
        default:
            line.percorsoID = percorsoID;
            routeMap.gLines.push(line);
        break;
        case "tratta": 
            line.percorsoID = percorsoID;
            line.trattaID = trattaID;
            routeMap.gTratte.push(line);
        break;
    }
	return line;		 
}  
// ==================================  
// ====== Delete Lines ==============
// ================================== 
routeMap.deleteLine = function(lineType) {
    
    var emptyArray = []; 
    if (typeof lineID == "undefined") {
        lineID = "all";
    }
    if(lineType == "percorso") {
        for (var n = 0, route; route = routeMap.gLines[n]; n++) {
            route.setMap(null);
        }
        routeMap.gLines = emptyArray; 
    }     
    
    for (var i = 0, leg; leg = routeMap.gTratte[i]; i++) {
            leg.setMap(null);
    }
    routeMap.gTratte = emptyArray; 
}
// ==================================
// ===== Toggle Routes & Stops ======
// ===== on percorso tab click ======
// ==================================
routeMap.togglePercorso = function(oldPercorso, newPercorso, tratta) {
    
    if( oldPercorso !== null ){
        //toogle off percorso markers
        routeMap.toggleStops(false, oldPercorso);
        //toogle off entire Percorso & tratte 
        routeMap.deleteLine("percorso");
     }
    
    routeMap.createLine( routeMap.mapLines[newPercorso], "percorso", newPercorso );
    routeMap.toggleStops(true, newPercorso);
   // routeMap.createLine( routeMap.mapLines[newPercorso][tratta], "tratta", newPercorso, tratta );
    routeMap.zoomIt(routeMap.mapLines[newPercorso].pts, "percorso");       
}
// ==================================
// ===== Toggle Tratta Only on ======
// ===== fermata tab/marker click ===
// ==================================
routeMap.toggleTratta = function(oldTratta, newTratta, percorso) {
    //toogle off tratte 
    routeMap.deleteLine("tratta");    
    
    routeMap.createLine( routeMap.mapLines[percorso][newTratta], "tratta", percorso, newTratta );    
    routeMap.zoomIt(routeMap.mapLines[percorso][newTratta].pts, "tratta");   
}
