var currentMap;
box.dom(document).ready(function() {
    // Launch maps
    if ($('#travelTopsMap').length) {
        // Top guides
        var eid = $('#travelTopsMap').text();
        eid = eid.split(/\n/).join('').split(/\s/).join('');
        var dataGuides = l10n.url.markersDataGuide + '&eid=' + eid;
        $.get(dataGuides, function(data) {
            currentMap = gMap1;
            currentMap.counter = 1;
            currentMap.imageCounter = 1;
            var mapCenter = new google.maps.LatLng(0,0);
            var myMapGuides = currentMap.init('#travelTopsMap', data, mapCenter, 1);
        });
    } else if ($('#map').length) {
        // Guides
        var dataFile = l10n.url.markersDataPartnersAddresses + '&idGuide=' + getUrlParameter('idGuide');
        $.get(dataFile, function(data) {
            currentMap = gMap2;
            currentMap.counter = 1;
            currentMap.imageCounter = 1;
            var mapType = $(data).find('guideTypeId').text();
            var mapCenter = currentMap.getCoords($(data).find('marker:first'));
            switch (mapType) {
                case '1' :// natural site scale:50km
                    var zoom = 8;
                    break;
                case '4' :// cultural site scale:10km
                    zoom = 10;
                    break;
                case '5' :// pilgrim site scale:10km
                    zoom = 10;
                    break;
                default :// default scale:100km
                    zoom = 7;
                    break;
            }
            var myMap = currentMap.init('#map', data, mapCenter, zoom);
        });
    }  else if ($('#mapOffers').length) {
        // popup with tabs
        var dataFileOffers = l10n.url.markersDataSearched + '&sOfferTypeCode=' + getUrlParameter('sOfferTypeCode') + '&idOffer=' + getUrlParameter('idOffer');
        $.get(dataFileOffers, function(data) {
            currentMap = gMap4;
            currentMap.counter = 1;
            currentMap.imageCounter = 1;
            
            var mapCenter = currentMap.getCoords($(data).find('marker:first'));
            var i = 1;
            while (mapCenter == 'undefined' && i<10) {
                mapCenter = currentMap.getCoords($(data).find('marker').eq(i));
                i++;
            }
            var myMapOffers = null;
            setTimeout(function(){
                myMapOffers = currentMap.init('#mapOffers', data, mapCenter, 12);
            }, 3500);
            
            var dataFileCloseTo = l10n.url.markersDataPartnersAddresses + '&sOfferTypeCode=' + getUrlParameter('sOfferTypeCode') + '&idOffer=' + getUrlParameter('idOffer');
            $.get(dataFileCloseTo, function(data) {
                currentMap = gMap5;
                currentMap.counter = 1;
                currentMap.imageCounter = 1;
                var mapCenter = currentMap.getCoords($(data).find('marker:first'));
                var myMapCloseTo = currentMap.init('#mapCloseTo', data, mapCenter, 10);
            });
        });
    }
});
var gMap = {
    counter : 1,
    imageCounter : 1,
    infoWindowEnabled:true,
    infowindow : new google.maps.InfoWindow({disableAutoPan: false}),//disable autopan avoids losing map focus on hovering
    storedMarkers : [[0,0]],
    center : new google.maps.LatLng(0,0),
    zoom:2,
    map:null,
    init : function(mapContainer, markersData, markerMapCenter, mapZoom) {
        currentMap.center = markerMapCenter;
        currentMap.zoom = mapZoom;
        currentMap.counter = 1;
        currentMap.imageCounter = 1;
        mapContainer = $(mapContainer)[0];
        currentMap.createMap(mapContainer, markersData);
    },
    createMap : function(mapContainer, markersData) {
        /*creates a googlemap instance*/
        var mapOptions = {
            //zoom & center parameters changed by map.fitBounds()
            //zoom:5,
            //center: new google.maps.LatLng(0,0),
            mapTypeId: google.maps.MapTypeId.ROADMAP,
            mapTypeControl: true,
            scaleControl: true
        };
        //the map
        currentMap.map = new google.maps.Map(mapContainer, mapOptions);
        var bounds = currentMap.setMarkers(markersData, currentMap.map);
        //sets the viewpoint according to placed markers
        //map.fitBounds(bounds);
        //gives time to sets the map's bounds before adding a listener...
        
        setTimeout(function(){
            currentMap.manageMap(currentMap.map, markersData);
        }, 2000);
    },
    manageMap : function(map, markersData) {
        //waiting for the map to be idle
        //the 'bounds_changed' event causes too many requests
        map.setCenter(currentMap.center);
        map.setZoom(currentMap.zoom);
        /*
        var myListener = google.maps.event.addListener(map, 'idle', function() {
            gets map bounds for a new xml request
            var myBounds = currentMap.convertCoords(map.getBounds());
            xml = dataFile+'&x1='+myBounds[0]+'&y1='+myBounds[1]+'&x2='+myBounds[2]+'&y2='+myBounds[3];
            currentMap.setMarkers(markersData, map);
        });
        */
    },
    setMarkers : function(markersData, map) {
        var bounds = new google.maps.LatLngBounds();
            //checks brower & datatype for IE compatibility
            var j = 0;
            $(markersData).find('marker').each(function() {
                var marker = $(this);
                var myCoords = currentMap.getCoords(marker);        
                var myMarkerCoords = currentMap.convertCoords(myCoords.toString());
                myMarkerCoords = [parseFloat(myMarkerCoords[0]),parseFloat(myMarkerCoords[1])];

                
                // Avoid setting two markers with the same coordinates
                
                var markerExists = false;
                /*
                var i=0;
                while (i < currentMap.counter) {
                    if((myMarkerCoords[0] == currentMap.storedMarkers[i][0])&&(myMarkerCoords[1] == currentMap.storedMarkers[i][1])) {
                        markerExists = true;
                        break;
                    }
                    i++;
                }
                */
                if (markerExists === false) {
                    //adds marker
                    var place = currentMap.markerContent(marker);
                    var markerOptions = {
                        position: myCoords,
                        map: map,
                        icon: place.icon,
                        title: place.title
                    };
                    var myMarker = new google.maps.Marker(markerOptions);
                    //useful only on the first load :
                    bounds.extend(myCoords);
                    currentMap.storedMarkers.push(myMarkerCoords);

                    // over on a marker makes infowindow appear & changes the page content
                    if (currentMap.infoWindowEnabled) {
                        if (!(currentMap == gMap5 && place.current == 'true')) {
                           google.maps.event.addListener(myMarker, 'click', function() {
                                //currentMap.infowindow.content = place.content;
                                currentMap.infowindow.setContent(place.content);
                                currentMap.infowindow.open(map, myMarker);
                                //forces infowindow width
                                $('.gMapInfos').parent().css({'width':'300px', 'overflow':'hidden'});
                                $('.gMapInfos').parent().css({'overflow':'visible'});
                                /*
                                var moreListener = google.maps.event.addDomListener(".gMapInfos .more", 'click', function() {
                                   alert("Clicked"); 
                                });
                                */
                            });
                            
                            /*google.maps.event.addListener(myMarker, 'mouseout', function() {
                                currentMap.infowindow.close(map)
                            });*/
                        }
                    }
                    /*if (place.extUrl != '') {
                        google.maps.event.addListener(myMarker, 'click', function() {
                            window.open(place.extUrl).focus;
                            window.close(); 
                        });
                    }*/
                    currentMap.counter++;
                }
                
                
            });
        return bounds;
    },
    getCoords : function(marker) {
            var latitude = parseFloat(marker.find('latitude').text());
            //if (isNaN(latitude)) {alert(latitude);}
            var longitude = parseFloat(marker.find('longitude').text());
            var coords = new google.maps.LatLng(latitude, longitude);
            return coords;
        
    },
    markerContent : function(marker) {
        var place = {
            type : marker.find('type').text(),
            title : marker.find('title').text(),
            url : marker.find('url').text(),
            links : []
        };
        marker.find('links a').each(function() {
            place.links.push([$(this).attr('href'), $(this).text()]);
        });
        //alert(currentMap.imageCounter);
        switch (place.type) {
            // Offres
            case 'offer':
                place.id      = marker.find('id').text();
                place.current = marker.find('current').text();
                place.counter = currentMap.imageCounter;
                if (marker.find('counter').length) {
                    place.counter = marker.find('counter').text();
                }
                if (currentMap.imageCounter > 50) {
                    place.icon = l10n.url.pictos + 'picto-generic-gmap-marker.png';
                } else {
                    if (place.current == 'true') {
                        place.icon = l10n.url.pictos + 'picto-hotel-current-'+ place.counter +'-gmap-marker.png';
                    } else {
                        place.icon = l10n.url.pictos + 'picto-hotel-'+ place.counter +'-gmap-marker.png';
                    }
                }

                place.rate = marker.find('rate').text();
                place.address = marker.find('address').text();
                place.phone = marker.find('phone').text();
                place.website = marker.find('website').text();
                place.img = marker.find('src').text();
                place.extUrl = marker.find('exturl').text();
                place.desc = marker.find('desc').text();
                var linkList = ''; //'<li><a href="#contextual" onclick="javascript:gMap.loadMoreInfos('+place.id+');">' + l10n.more + '</a></li>';
                for (i = 0; i < place.links.length; i++) {
                    linkList = linkList + '<li><a href="' + place.links[i][0] + '">' + place.links[i][1] + '</a></li>';
                }
                place.content = '<div class="gMapInfos hotel" style="height:0;">'
                              + '   <img src="' + place.img + '" alt="" />'
                              + '   <h3>' + place.title + '<span class="rate">' + place.rate +'</span></h3>'
                              + '   <p>' + place.desc + '</p>'
                              + '   <p><a href="'+ place.extUrl +'" target="_blank">' + l10n.showOffer + '</a>'
                              //+ '   <ul class="links">'+linkList+'</ul>'
                              + '</div>';
                currentMap.imageCounter++;
            break;
            // Hebergement
            case 'housing':
                place.id        = marker.find('id').text();
                place.current   = marker.find('current').text();
                place.icon      = l10n.url.pictos + 'picto-housing-gmap-marker.png';
                place.rate      = marker.find('rate').text();
                place.address   = marker.find('address').text();
                place.phone     = marker.find('phone').text();
                place.website   = marker.find('website').text();
                place.img       = marker.find('src').text();
                place.extUrl    = marker.find('exturl').text();
                var linkList = '<li><a href="#contextual" onclick="javascript:gMap.loadMoreInfos('+place.id+');">' + l10n.more + '</a></li>';
                for (i = 0; i < place.links.length; i++) {
                    linkList = linkList + '<li><a href="' + place.links[i][0] + '">' + place.links[i][1] + '</a></li>';
                }
                place.content = '<div class="gMapInfos housing" style="height:0">'
                              + '    <img src="' + place.img + '" alt="" />'
                              + '    <h3>' + place.title + '<span class="rate">' + place.rate +'</span></h3>'
                              + '    <ul>';
                if (place.address != '') {
                    place.content = place.content + '<li>' + place.address + '</li>';
                }
                if (place.phone != '') {
                    place.content = place.content + '<li>' + place.phone + '</li>';
                }
                place.content = place.content + '</ul>'
                              + '    <ul class="links">' + linkList + '</ul>'  
                              + '</div>';
            break;
            // Restauration
            case 'restoration':
                place.id        = marker.find('id').text();
                place.current   = marker.find('current').text();
                place.icon      = l10n.url.pictos + 'picto-restaurant-gmap-marker.png';
                place.rate      = marker.find('rate').text();
                place.address   = marker.find('address').text();
                place.phone     = marker.find('phone').text();
                place.website   = marker.find('website').text();
                place.img       = marker.find('src').text();
                place.extUrl    = marker.find('exturl').text();
                var linkList = '<li><a href="#contextual" onclick="javascript:gMap.loadMoreInfos('+place.id+');">' + l10n.more + '</a></li>';
                for (i = 0; i < place.links.length; i++) {
                    linkList = linkList + '<li><a href="' + place.links[i][0] + '">' + place.links[i][1] + '</a></li>';
                }
                place.content = '<div class="gMapInfos restaurant" style="height:0;">'
                              + '    <img src="' + place.img+ '" alt="" />'
                              + '    <h3>' + place.title + '<span class="rate">' + place.rate +'</span></h3>'
                              + '    <ul>';
                if (place.address != '') {
                    place.content = place.content + '<li>' + place.address + '</li>';
                }
                if (place.phone != '') {
                    place.content = place.content + '<li>' + place.phone + '</li>';
                }
                place.content = place.content + '</ul>'
                              + '    <ul class="links">' + linkList + '</ul>'  
                              + '</div>';
            break;
            // Autre activité
            case 'otherActivity':
                place.id        = marker.find('id').text();
                place.current   = marker.find('current').text();
                place.icon      = l10n.url.pictos + 'picto-activity-gmap-marker.png';
                place.rate      = marker.find('rate').text();
                place.address   = marker.find('address').text();
                place.phone     = marker.find('phone').text();
                place.website   = marker.find('website').text();
                place.img       = marker.find('src').text();
                place.extUrl    = marker.find('exturl').text();
                var linkList = '<li><a href="#contextual" onclick="javascript:gMap.loadMoreInfos('+place.id+');">' + l10n.more + '</a></li>';
                for (i = 0; i < place.links.length; i++) {
                    linkList = linkList + '<li><a href="' + place.links[i][0] + '">' + place.links[i][1] + '</a></li>';
                }
                place.content = '<div class="gMapInfos activity" style="height:0;">'
                              + '    <img src="' + place.img  + '" alt="" />'
                              + '    <h3>' + place.title + '<span class="rate">' + place.rate +'</span></h3>'
                              + '    <ul>';
                if (place.address != '') {
                    place.content = place.content + '<li>' + place.address + '</li>';
                }
                if (place.phone != '') {
                    place.content = place.content + '<li>' + place.phone + '</li>';
                }
                place.content = place.content + '</ul>'
                              + '    <ul class="links">' + linkList + '</ul>'  
                              + '</div>';
            break;
            // Zone protégée
            case 'protectedArea':
                place.icon = l10n.url.pictos + 'picto-protected-area-gmap-marker.png';
                place.content = '<div class="gMapInfos protectedArea" style="height:0;">'
                              + '   <img src="/templates/touringnature/common/img/logo/logo-unep.gif" alt="UNEP" class="unep" />'
                              + '   <h3>' + place.title + '</h3>'
                              + '   <p>' + l10n.protectedArea + '</p>'
                              + '</div>';
                place.extUrl = '';
            break;
            // Guide ...
            default :
                place.desc = marker.find('desc').text();
                place.extUrl = marker.find('exturl').text();
                place.content = '<div class="gMapInfos" style="height:0">'
                              + '<h3>' + place.title + '</h3>'
                              + '   <p>' + place.desc + '</p>'
                              + '   <p><a href="'+ place.extUrl +'" target="_blank">' + l10n.more + '</a>'
                              + '</div>';
            break;
        }
        return place;
    },
    convertCoords :function(coords) {
        coords = coords.toString();
        coords = coords.split('(').join('');
        coords = coords.split(')').join('');
        coords = coords.split(', ');
        return coords;
    },
    loadMoreInfos : function(markerId) {
        openLoader('contextual');

        $.get('index.php?option=com_popup&view=partnerdetails&format=raw&idAddress='+markerId,
        function(data) {
            $("#contextual").replaceWith('<div id="contextual">' + data + '</div>');
            var targetOffset = $('#contextual').offset().top;
            $('html,body').animate({scrollTop: targetOffset}, "normal");

        });
    }
};
var gMap1 = clone(gMap);
var gMap2 = clone(gMap);
var gMap3 = clone(gMap);
var gMap4 = clone(gMap);
var gMap5 = clone(gMap);

var openLoader = function(where) {
    var h = $('#'+where).height();
    var w = $('#'+where).width();
    $('#' + where).replaceWith('<div id="' + where + '"><img src="' + l10n.url.transparent + '" alt="' + l10n.loading + '" style="height:'+h+'px; width:'+w+'px; background:url(' + l10n.url.loader + ') no-repeat 50% 50%" /></div>');
};
var newWindow = function(address) {
    window.parent.location = address;
};
var getUrlParameter = function(name) {
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regexS = "[\\?&]"+name+"=([^&#]*)";
    var regex = new RegExp( regexS );
    var results = regex.exec( window.location.href );
    if( results === null ) {
        return "";
    } else {
        return results[1];
    }
};

function clone(obj) {
    // A clone of an object is an empty object 
    // with a prototype reference to the original.
    // a private constructor, used only by this one clone.
    function Clone() { } 
    Clone.prototype = obj;
    var c = new Clone();
    c.constructor = Clone;
    return c;
}

