var lastCity;
var meMarker;
var selMarker;
var context     = "events";
var contextShow = "events_upcoming";
var sort        = "name_a_z";
var filter      = "all";
var wUrlLast    = "";

var initialZoomLevel   = 13;
var minZoomLevel       = 3;
var maxZoomLevel       = 19;
var skipZoomLevel      = 5;
var markerWindowOpenAt = 12;
var vertPadding        = 80;

var gmap;
var gdir;
var mgr;
var mrk;
var allCatMarkers = [];
var findMarker = false;
var findMarkerID;
var markMarkerID  = -1;
var markMarkerVID = -1;
var findMarkerPoint;
var findMarkerCategory;
var zoomRanges        = new Array();
var prevContextTAB    = new Array();
var weatherTAB        = new Array();
zoomRanges['general'] = new Array();

// for mapping of zoom levels => place marker definition files
var zoomMAP = new Array();
zoomMAP['general'] = new Array();
zoomMAP['general'][2]  = 2;
zoomMAP['general'][3]  = 3;
zoomMAP['general'][4]  = 3;
zoomMAP['general'][5]  = 3;
zoomMAP['general'][6]  = 6;
zoomMAP['general'][7]  = 6;
zoomMAP['general'][8]  = 6;
zoomMAP['general'][9]  = 9;
zoomMAP['general'][10] = 9;
zoomMAP['general'][11] = 9;
zoomMAP['general'][12] = 12;
zoomMAP['general'][13] = 12;
zoomMAP['general'][14] = 12;
zoomMAP['general'][15] = 12;
zoomMAP['general'][16] = 12;
zoomMAP['general'][17] = 12;
zoomMAP['general'][18] = 12;
zoomMAP['general'][19] = 12;

// for storing place marker id's that have already been added to the Marker Manager
var zoomIDS = new Array();
zoomIDS['general'] = new Array();

// for storing GPS rectangle boundaries that have already been queried for
var zoomBNDS = new Array();
zoomBNDS['general'] = new Array();



function logIt(obj) {

    var str = "<hr/>";
    for (prop in obj)
    { str += prop + " value :" + obj[prop] + "\n<br/>"; }
    str += "<hr/>";

    alert(str);
}

var prevCoords  = "";
var prevContext = "";
var loadingState = 0;
var ignoreLoading = false;

function ShowCityPage() {

    if (selMarker !== undefined) {
        gmap.removeOverlay(selMarker);
        selMarker = undefined;
    }


   showDetailsBelow('masters/city-page.php?city=' + lastCity['l'] + "&lat=" + lastCity['lt'] + "&lon=" + lastCity['ln'] + "&country=" + lastCity['ct'] + "&flickr=" + lastCity['f']);

    var zoomTo = lastCity['z'];
    gmap.setCenter(new GLatLng(lastCity['lt'], lastCity['ln']), zoomTo);
    ShowContext();
    ObtainMarkersIfNeeded(zoomTo);
}


function LoadingIncrease() {
    return;
    if (ignoreLoading === true) 
    {
        ignoreLoading = false;
        return;
    }


    if (!loadingState) {
        document.getElementById('menu_left').style.visibility = 'hidden';
        var ld = document.getElementById('loadingMarkers');        
        ld.style.visibility = 'visible';
        ld.style.display = 'block';
    }
    loadingState++;
}

function LoadingDecrease() {
    return;
    loadingState--;

    if (!loadingState) {        
        var ld = document.getElementById('loadingMarkers');
        ld.style.visibility = 'hidden';
        ld.style.display = 'none';
        document.getElementById('menu_left').style.visibility = 'visible';
    }
    
}


function ObtainMarkersIfNeeded(zoom) {

    var bnds = gmap.getBounds();
    var sw = bnds.getSouthWest();
    var ne = bnds.getNorthEast();
    var coords = "?sw_lat=" + sw.lat() + "&sw_lng=" + sw.lng() + "&ne_lat=" + ne.lat() + "&ne_lng=" + ne.lng();
 
    if ((prevContext == context) && (coords == prevCoords))
        return;

    coords += "&city=" + lastCity['l'] + "&country=" + lastCity['ct'] + "&sub=" + contextShow;

    for (var c = prevContextTAB.length - 1; c >= 0; c--)
        if (prevContextTAB[c] == context + coords)
        return;

    prevContext = context;
    prevCoords  = coords;        
    prevContextTAB.push(context + coords);

    if (context == "flights")
        return;


    // check if obtaining general markers is required
    if ( (zoom < markerWindowOpenAt) && (zoomRanges['general'][zoom] === undefined) )
    {
        // check if this rectangle wasn't obtained previously
        var zRangeStart = zoomMAP['general'][zoom];
        if (zoomBNDS['general'][zRangeStart] !== undefined) {
            var zRanges = zoomBNDS['general'][zRangeStart];
            for (var z = 0; z < zRanges.length; z++) 
            {
                if (zRanges[z].containsBounds(bnds)) {return; }
            }

        }

        LoadingIncrease();
        GDownloadUrl(BASE_URL + "/code/maps/zoom" + zoomMAP['general'][zoom] + ".php" + coords, LoadMarkersGMAP);
    }



    if (context != "none") {
        // check if obtaining current context markers is required
        if (zoomRanges[context] === undefined) {
            zoomRanges[context] = new Array();
            zoomIDS[context] = new Array();
            zoomBNDS[context] = new Array();

            zoomMAP[context] = new Array();
            zoomMAP[context][2] = markerWindowOpenAt;
            zoomMAP[context][3] = markerWindowOpenAt;
            zoomMAP[context][4] = markerWindowOpenAt;
            zoomMAP[context][5] = markerWindowOpenAt;
            zoomMAP[context][6] = markerWindowOpenAt;
            zoomMAP[context][7] = markerWindowOpenAt;
            zoomMAP[context][8] = markerWindowOpenAt;
            zoomMAP[context][9] = markerWindowOpenAt;
            zoomMAP[context][10] = markerWindowOpenAt;
            zoomMAP[context][11] = markerWindowOpenAt;
            zoomMAP[context][12] = markerWindowOpenAt;
            zoomMAP[context][13] = markerWindowOpenAt;
            zoomMAP[context][14] = markerWindowOpenAt;
            zoomMAP[context][15] = markerWindowOpenAt;
            zoomMAP[context][16] = markerWindowOpenAt;
            zoomMAP[context][17] = markerWindowOpenAt;
            zoomMAP[context][18] = markerWindowOpenAt;
            zoomMAP[context][19] = markerWindowOpenAt;
        }

        //alert(zoom + " >= " + markerWindowOpenAt);

        //if ((zoom >= markerWindowOpenAt) && (zoomRanges[context][zoom] === undefined)) 
        {
            // check if this rectangle wasn't obtained previously
//            var zRangeStart = zoomMAP[context][zoom];
//            if (zoomBNDS[context][zRangeStart] !== undefined) {
//                var zRanges = zoomBNDS[context][zRangeStart];
//                for (var z = 0; z < zRanges.length; z++) {
//                    if (zRanges[z].containsBounds(bnds)) { return; }
//                }

//            }
//            alert(coords);

            
            LoadingIncrease();            
            GDownloadUrl(BASE_URL + "/code/maps/" + context + "Handlers.php" + coords, LoadMarkersGMAP);
        }

    }    

    
}

function ObtainMarkersIfNeededEvent() 
{
    ObtainMarkersIfNeeded(gmap.getZoom());
}


function ForceRefreshGMAP() {
//    var cZoom = gmap.getZoom();
//    var nZoom = (cZoom < 19) ? cZoom + 1 : cZoom - 1;
//    gmap.setZoom(nZoom);
//    gmap.setZoom(cZoom);
}



function ShowCategoryMarker() {

    for (var m = 0; m < allCatMarkers.length; m++) {
        var mark = allCatMarkers[m];

        if (mark.category != findMarkerCategory) {
            continue;
        }

        if (mark.myParams['id'] == findMarkerID) {
            GEvent.trigger(mark, "click");
            return;
        }


        //			        if (findMarkerPoint.equals(mark.getLatLng())) {
        //			            GEvent.trigger(mark, "click");
        //			            break;
        //			        }
        //			        

    }

    setTimeout("ShowCategoryMarker();", 300);

}


function FindCategoryMarker(id, lat, lng, categ) {

    if (MarkMarker(id, categ))
        return;

    if ((lat == 0) && (lng == 0))
        return ShowDetailsCategory(id, categ);

    findMarker         = true;
    findMarkerID       = id;
    findMarkerCategory = categ;
    findMarkerPoint = new GLatLng(lat, lng);
    //ObtainMarkersIfNeeded(markerWindowOpenAt);

    gmap.panTo(findMarkerPoint);

    if (context != findMarkerCategory) {
        ChangeContext(findMarkerCategory);
    }

    ShowCategoryMarker();
    findMarker = false;

}


function UpdateWeather(doc) {

    if (document.getElementById('weather') == null) {
        return;
    }


    if (doc == null) {
        var wUrl = BASE_URL + "/code/maps/weather.php?lat=" + meMarker.myParams['lt'] + "&lon=" + meMarker.myParams['ln'] + "&city=" + meMarker.myParams['l'];

        if (weatherTAB[wUrl] === undefined) {
            wUrlLast = wUrl;
            GDownloadUrl(wUrl, UpdateWeather);
            return;
        }

        wUrlLast = wUrl;
        doc = weatherTAB[wUrl];
    }

    
    weatherTAB[wUrlLast] = doc;
    document.getElementById('weather').innerHTML = doc;
}


function SetMeMarker() {

    var posn = new GLatLng(lastCity["lt"], lastCity["ln"]);
    var categ = (context == "none") ? "wikiguides" : context;

   
    if ( (meMarker !== undefined) && (meMarker.getLatLng().equals(posn)) ) 
    {
    return;
    }



    if (detailsVisible) 
    {
        //showDetailsBelow('');
    }
    


    if (meMarker !== undefined) {
        mgr.removeMarker(meMarker);
    }

    
    

    var markerOpts = {};
    
    var myIcon = new GIcon(); ;
    myIcon.image = BASE_URL + "/code/images/markerME.png";
    myIcon.imageOut = BASE_URL + "/code/images/markerME.png";
    myIcon.imageOver = BASE_URL + "/code/images/markerMEMO.png";
    myIcon.iconSize = new GSize(32, 32);
    myIcon.iconAnchor = new GPoint(13, 25);
    myIcon.infoWindowAnchor = new GPoint(16, 22);
    markerOpts.icon = myIcon;
    markerOpts.zIndexProcess = function() { return 100000000; };

    meMarker = new GMarker(posn, markerOpts);
    meMarker.myParams = lastCity;
    meMarker.category = "general";
    meMarker.meMarker = true;
    
    document.getElementById("showingNOW").innerHTML = lastCity["l"] + '.';
        
    UpdateWeather(null);

    mrk = meMarker;
    var handler = createMarkerClickHandler(meMarker);
    GEvent.addListener(meMarker, "click", handler);

    var handler_over = createMarkerOverHandler(meMarker, myIcon.imageOver);
    GEvent.addListener(meMarker, "mouseover", handler_over);

    var handler_out = createMarkerOutHandler(meMarker, myIcon.imageOut);
    GEvent.addListener(meMarker, "mouseout", handler_out);


    mgr.addMarker(meMarker, 0, 19);
    mgr.refresh();        
}

function SetDefaultMeMarker() {

lastCity = new Array();
lastCity["id"]  = 11595;
lastCity["l"] = "Milano";
lastCity["ct"] = "Italy";
lastCity["lt"]  = 45.4643;
lastCity["ln"]  = 9.18951;
lastCity["i"]   = "markerME.png";
lastCity["z"]   = 13;
lastCity["f"]   = "Milano dj party";
lastCity["imo"] = "markerMEMO.png";

if (1 && google.loader.ClientLocation !== null) {
    lastCity["id"] = 0;
    lastCity["l"] = google.loader.ClientLocation.address.city;
    lastCity["ct"] = google.loader.ClientLocation.address.country;
    lastCity["lt"] = google.loader.ClientLocation.latitude;
    lastCity["ln"] = google.loader.ClientLocation.longitude;
    lastCity["i"] = "markerME.png";
    lastCity["z"] = 13;
    lastCity["f"] = lastCity["l"] + "dj party";
    lastCity["imo"] = "markerMEMO.png";
    
}


SetMeMarker();
setTimeout("GEvent.trigger(meMarker, 'click');", 300);
}

function ChangeLocation(id)
{
    var frm = document.getElementById(id);
    var lat = parseFloat(frm.centro_lat.value, 10);


    if (isNaN(lat)) {
        var lId   = "autoSuggestionsList" + id.replace(/frmAuto/, "")
        var sList = document.getElementById(lId);
        var split = sList.innerHTML.split('"');

        if (split.length != 3) {
            alert('Please choose location from list');
            document.getElementById('suggestions' + id.replace(/frmAuto/, '')).style.display = 'block';
            return 0;
        } else {
            eval(split[1]);
        }


    }
    
    lastCity = new Array();
    lastCity["id"] = 0;
    lastCity["l"]  = frm.where.value;
    lastCity["ct"] = frm.country.value;
    lastCity["lt"] = frm.centro_lat.value;
    lastCity["ln"] = frm.centro_long.value;
    lastCity["z"]  = frm.zoom.value;
    lastCity["f"]  = frm.flickr.value;
    SetMeMarker();
    gmap.setCenter(meMarker.getLatLng(), lastCity["z"]);
        
    return 1;
}

function ChangeLocationParamsMAP(city, country, lat, lon, zoom, flickr) 
{
    lastCity = new Array();
    lastCity["id"] = 0;
    lastCity["l"]  = city;
    lastCity["ct"] = country;
    lastCity["lt"] = lat;
    lastCity["ln"] = lon;
    lastCity["z"]  = zoom;
    lastCity["f"]  = flickr;
    
    SetMeMarker();
    gmap.setCenter(meMarker.getLatLng(), gmap.getZoom());
}


function ChangeLocationParams(city, country, lat, lon, zoom, flickr) {

    ChangeLocationParamsMAP(city, country, lat, lon, zoom, flickr);
    ShowCityPage();
}


function ChangeLocationCateg(id) {


    var frm = document.getElementById(id);

    var radioValue = "";
    var radioLength = frm.search.length;
    for (var i = 0; i < radioLength; i++) 
    {
        if (frm.search[i].checked) 
        {
            radioValue = frm.search[i].value;
            break;
        }
    }

//    if (frm.id_city.value == '') {
//        alert('Please choose a location');
//        return;    
//    }
//    

    if (radioValue == "") {
        alert('Please choose a category');
        return;
    }

    if (!ChangeLocation(id)) {
        return;
    }


    ChangeContext(radioValue);
}

function MarkMarker(id, categ) {

    if ( (categ == "events_today") || (categ == "events_tomorrow") || (categ == "events_thisweek") || (categ == "events_upcoming") )
        categ = "events";

    var zero = new GLatLng(0, 0);
    for (var m = 0; m < allCatMarkers.length; m++) {
        var mark = allCatMarkers[m];

        if ( (mark.category == categ) && (mark.myParams['id'] == id) && !mark.getLatLng().equals(zero) ) {
            GEvent.trigger(mark, "click");
            return true;
        }
    }

    return false;
}



function ShowDetails(id) {

    if (context != 'movies') {
        if (MarkMarker(id, context))
            return;

        markMarkerID = id;    
    }
    
    document.getElementById('details').innerHTML = "";
    showDetailsBelow('../maps/' + context + 'Handlers.php?details=' + id + "&city=" + lastCity['l'] + "&lat=" + lastCity['lt'] + "&lon=" + lastCity['ln'] + "&country=" + lastCity['ct'] + "&sub=" + contextShow);   
}

function ShowDetailsCategory(id, categ, vid) {
    markMarkerVID = (vid !== undefined) ? vid : -1;                        


    if (context != 'movies') {
    	
        if ((context != categ) && (contextShow != categ)) {
            PrepareContextChange(categ);
            var zoomTo = markerWindowOpenAt;
            gmap.setCenter(meMarker.getLatLng(), zoomTo);
            RefreshCategoryMarkers();

            if ((categ == "events_upcoming") && (vid !== undefined)) {
                markMarkerVID = -1;
                MarkMarker(vid, categ);
                return;
            }


            document.getElementById('details').innerHTML = document.getElementById('loading').innerHTML;
            markMarkerID  = id;
            ObtainMarkersIfNeeded(zoomTo);  
            return;
        }

        if ( (vid === undefined) && MarkMarker(id, categ))
            return;

        if ((vid !== undefined) && MarkMarker(vid, categ)) {
            markMarkerVID = -1;
            document.getElementById('details').innerHTML = "";
            categ = categ.replace(/events_upcoming/, "events");
            showDetailsBelow('../maps/' + categ + 'Handlers.php?details=' + id + "&city=" + lastCity['l'] + "&lat=" + lastCity['lt'] + "&lon=" + lastCity['ln'] + "&country=" + lastCity['ct'] + "&sub=" + contextShow);
            return;
        }

        markMarkerID  = id;
        /*theese three lines are a fix for the blank page issue. it appears when it fails all the checks in this if
        probably the bug is related to MarkMarker function*/
        document.getElementById('details').innerHTML = "";
    	categ = categ.replace(/events_upcoming/, "events");
    	showDetailsBelow('../maps/' + categ + 'Handlers.php?details=' + id + "&city=" + lastCity['l'] + "&lat=" + lastCity['lt'] + "&lon=" + lastCity['ln'] + "&country=" + lastCity['ct'] + "&sub=" + contextShow);

    }

    
    document.getElementById('details').innerHTML = "";
    showDetailsBelow('../maps/' + categ + 'Handlers.php?details=' + id + "&city=" + lastCity['l'] + "&lat=" + lastCity['lt'] + "&lon=" + lastCity['ln'] + "&country=" + lastCity['ct'] + "&sub=" + contextShow);
}


function ShowPrevious(id) {
    showDetailsBelow('../maps/' + context + 'Handlers.php?prev=' + id + "&city=" + lastCity['l'] + "&lat=" + lastCity['lt'] + "&lon=" + lastCity['ln'] + "&country=" + lastCity['ct'] + "&sub=" + contextShow);
}

function ShowNext(id) {
    showDetailsBelow('../maps/' + context + 'Handlers.php?next=' + id + "&city=" + lastCity['l'] + "&lat=" + lastCity['lt'] + "&lon=" + lastCity['ln'] + "&country=" + lastCity['ct'] + "&sub=" + contextShow);
}

function ShowBooking(id) {
    document.getElementById('details').innerHTML = "";
    showDetailsBelow('../maps/' + context + 'Handlers.php?booking=' + id + "&city=" + lastCity['l'] + "&lat=" + lastCity['lt'] + "&lon=" + lastCity['ln'] + "&country=" + lastCity['ct'] + "&sub=" + contextShow);   
}

function BackToList() {
    showDetailsBelow('');
}



function RefreshCategoryMarkers() {

    var cShow = 0;
    var cHide = 0;

   

    if (context == 'events') 
    {
        for (var m = 0; m < allCatMarkers.length; m++) 
        {
            if ((allCatMarkers[m].category == context) && ( allCatMarkers[m].myParams['t'].length || (contextShow == 'events_upcoming') )) 
            {                
                if (allCatMarkers[m].isHidden()) {
                    allCatMarkers[m].show();
                    cShow++;
                }
            }
            else if (!allCatMarkers[m].isHidden()) {
            allCatMarkers[m].hide();
            cHide++;
            }
        //else alert("HMM: " + allCatMarkers[m].myParams['l']);                        
        }

        //alert('SHOW: ' + cShow + '  HIDE: ' + cHide);

        if (filter != "all")
            ChangeFilter(filter, true);
        
        ForceRefreshGMAP();
        return;
    }

    


    for (var m = 0; m < allCatMarkers.length; m++) 
    {
        if (allCatMarkers[m].category == context) {
            if (1 || allCatMarkers[m].isHidden()) {
                allCatMarkers[m].show();
                cShow++;            
            }
        }
        else if (!allCatMarkers[m].isHidden()) {
        allCatMarkers[m].hide();
            cHide++;
        }
    }

    //alert('SHOW: ' + cShow + '  HIDE: ' + cHide);

    if (filter != "all")
        ChangeFilter(filter, true);
    
    ForceRefreshGMAP();   
}


function ShowContext() 
{
var sNow = document.getElementById("showingNOW");
var zoom = gmap.getZoom();

if (1 || zoom >= markerWindowOpenAt) {
    sNow.innerHTML = (context == "none") ? lastCity['l'] + "." : lastCity['l'] + ".";
    SetMeMarker();            
}
else if (zoom >= 9)
    sNow.innerHTML = "showing all cities";
else if (zoom >= 6)
    sNow.innerHTML = "showing main cities";
else if (zoom >= 3)
    sNow.innerHTML = "showing all capitals";
else if (zoom >= 2)
    sNow.innerHTML = "showing all countries";
}



function ResetGMAP() {
    SetDefaultMeMarker();
    showFullMAP();
    gdir.clear();
    gmap.setCenter(meMarker.getLatLng(), initialZoomLevel);

    context = "events";
    contextShow = "events_today";
    sort = "name_a_z";
    filter = "all";    
    ShowContext("events_today");
    clearDirections();

    if (selMarker !== undefined) {
        gmap.removeOverlay(selMarker);
    }

}


function ZoomInGMAP() {
    var zoom = Math.min(gmap.getZoom() + skipZoomLevel, maxZoomLevel);
    gmap.setZoom(zoom);

    ShowContext();
    //RefreshCategoryMarkers();
    ObtainMarkersIfNeeded(zoom);
}



function ZoomInMarkerGMAP() {
    ZoomInGMAP();
    gmap.setCenter(mrk.getLatLng());
    ShowContext();    
}

function ZoomOutGMAP()
{
var zoom = Math.max(gmap.getZoom() - skipZoomLevel, minZoomLevel);
gmap.setZoom(zoom);

ShowContext();
//RefreshCategoryMarkers();
ObtainMarkersIfNeeded(zoom);
}

function ZoomOutMarkerGMAP() {
    ZoomOutGMAP();
    gmap.setCenter(mrk.getLatLng());
    ShowContext();    
}


function ZoomOutOfHereGMAP() {
    var zoomTo = 3;
    gmap.setCenter(mrk.getLatLng(), zoomTo);
    ShowContext();
    ObtainMarkersIfNeeded(zoomTo);
}

function ZoomHereGMAP() {
    
    var zoomTo = mrk.myParams['z'];
    zoomTo = (gmap.getZoom() < 12) ? 12 : 12;
    
    gmap.setCenter(mrk.getLatLng(), zoomTo);
    ShowContext();
    ObtainMarkersIfNeeded(zoomTo);
}


function DirectionToHereGMAP()
{
    GEvent.trigger(mrk, "to");
    gmap.checkResize();
}


function DirectionFromHereGMAP()
{
    GEvent.trigger(mrk, "from");
    gmap.checkResize();
}




function ChangeTypeGMAP(type)
{
    gmap.setMapType(type);
    document.getElementById("map_canvas").style.backgroundColor = (type == G_SATELLITE_MAP) ? "#000000" : "#ffffff";
    document.getElementById('weather-text').className = (type == G_SATELLITE_MAP) ? "weather-white" : "weather-black";
    var div_txt = document.getElementById('weather-text').innerHTML;
	var div_src = document.getElementById('wbutton').src;

	if(type == G_SATELLITE_MAP){
		div_txt_ub = (div_txt.replace("icons/", "iconsW/"));
		div_src_ub = (div_src.replace("icons/", "iconsW/"));
		document.getElementById('weather-text').innerHTML = div_txt_ub;
      	document.getElementById('wbutton').src = div_src_ub;
	} else {
		div_txt_uw = (div_txt.replace("iconsW/", "icons/"));
		div_src_uw = (div_src.replace("iconsW/", "icons/"));
		document.getElementById('weather-text').innerHTML = div_txt_uw;
      	document.getElementById('wbutton').src = div_src_uw;
	}

}


function showTooltip(marker) 
{
    mytooltip = document.getElementById('tooltip');
    
    if ( (contextShow == 'events_today') && (marker.category == 'events') )    
        mytooltip.innerHTML = '' + marker.tooltipT;
    else if ( (contextShow == 'events_upcoming')  && (marker.category == 'events') )
        mytooltip.innerHTML = '' + marker.tooltipU;
    else
        mytooltip.innerHTML = '' + marker.tooltip;

    var pixel  = gmap.fromLatLngToContainerPixel(marker.getLatLng());
    var anchor = marker.getIcon().iconAnchor;
    var width  = marker.getIcon().iconSize.width;
    var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(5 + pixel.x - anchor.x + width, pixel.y + anchor.y));
    
    pos.apply(mytooltip);
    mytooltip.style.visibility = "visible";
    mytooltip.style.display    = "block";
}


function createMarkerOverHandler(marker, imgOver) 
{
    return function() {
        //if ((selMarker === undefined) || (marker != selMarker))
        { marker.setImage(imgOver); }
        marker.tooltip = marker.myParams['l'];
        if (marker.myParams['t'] !== undefined)
            marker.tooltipT = marker.myParams['t'] + "<br/>@" + marker.tooltip;
        if (marker.myParams['tu'] !== undefined)
            marker.tooltipU = marker.myParams['tu'] + "<br/>@" + marker.tooltip;
        showTooltip(marker);
        return false;
    };
}

function createMarkerOutHandler(marker, imgOut) {
    return function() {
    //if ( (selMarker === undefined) || (marker != selMarker))
        { marker.setImage(imgOut); }
        document.getElementById('tooltip').style.visibility = "hidden";
        return false;
    };
}


var lastDirections = "";

function ReshowDirections() {

    document.getElementById('details').innerHTML = lastDirections;
    if (!detailsVisible) { showDetailsNoLoad();}
}


function SetupDirections() {

    if (gdir.getStatus().code == G_GEO_SERVER_ERROR) {
        setTimeout("SetupDirections();", 100);
        return;
    }
    

    var poly = gdir.getPolyline();
    if (poly != null) {
        lastDirections = document.getElementById('details').innerHTML;
        GEvent.addListener(poly, "click", function() { ReshowDirections(); });

        var m1 = gdir.getMarker(0);
        var m2 = gdir.getMarker(1);
        m2.setImage(BASE_URL + "/code/images/markerB.png");
        m1.setImage(BASE_URL + "/code/images/markerA.png");
        //logIt(m1.icon);
    }
            
}

function clearDirections() {
    gdir.clear()

    if (document.getElementById('gDirections') !== null) {
        document.getElementById('gDirections').innerHTML = "";
    }

}


function getDirections(pfix) {
    var opts = {};
    if (document.getElementById("walk" + pfix) && document.getElementById("walk" + pfix).checked)
        opts.travelMode = G_TRAVEL_MODE_WALKING;

    if (document.getElementById("highways" + pfix) && document.getElementById("highways" + pfix).checked)
        opts.avoidHighways = true;

    var saddr = document.getElementById("saddr" + pfix).value;
    var daddr = document.getElementById("daddr" + pfix).value;

    
    gdir.load("from: " + saddr + " to: " + daddr, opts);

    setTimeout("SetupDirections();", 100);
    showDetailsNoLoad();    
}



function ShowWikiguides() {
    gmap.setCenter(mrk.getLatLng(), markerWindowOpenAt);
    showDetailsBelow('wikiguides/wikiguides.php?city='+ lastCity['l']);
}






function LoadMarkerData(doc) {
    mrk.desc = doc;

    if (mrk.dLoaded === undefined)
        mrk.dLoaded = new Array();
    
    mrk.dLoaded[contextShow] = true;
    
    //AddMarkerOptionsMenu(mrk);
    //mrk.openInfoWindowHtml(mrk.desc);
    ignoreLoading = true;
}




function createMarkerClickHandler(marker) 
{
    
    
    // hanlde 'zoom in' marker clicks
    //if ( marker.meMarker === false && (gmap.getZoom() < markerWindowOpenAt) ) 
     if (marker.category == 'general')
    {
        return function() {
            lastCity = marker.myParams;
            var zoomTo = gmap.getZoom();
            zoomTo = marker.myParams['z']
            gmap.setCenter(marker.getLatLng(), zoomTo);
            showDetailsBelow('masters/city-page.php?city=' + lastCity['l'] + "&lat=" + lastCity['lt'] + "&lon=" + lastCity['ln'] + "&country=" + lastCity['ct']);
            ShowContext();
            ObtainMarkersIfNeeded(zoomTo);
            RefreshCategoryMarkers();
        };
    }

    document.getElementById('tooltip').style.visibility = "hidden";
    
    // handle click for all other categories
    return function() {
        mrk = marker;
        if (selMarker !== undefined) {
            gmap.removeOverlay(selMarker);
        }

        //alert(marker.category);

        var markerOpts = {};
        var myIcon = new GIcon(); ;
        myIcon.image = BASE_URL + "/code/images/markerSEL.png";
        myIcon.imageOver = BASE_URL + "/code/images/markerSEL.png";
        myIcon.imageOut = BASE_URL + "/code/images/markerSEL.png";
        myIcon.iconSize = new GSize(32, 32);
        myIcon.iconAnchor = new GPoint(13, 25);
        myIcon.infoWindowAnchor = new GPoint(16, 24);
        markerOpts.icon = myIcon;
        markerOpts.zIndexProcess = function() { return 100000000; };

        selMarker = new GMarker(marker.getLatLng(), markerOpts);
        selMarker.myParams = marker.myParams;
        selMarker.category = marker.category;
        var handler_over = createMarkerOverHandler(selMarker, myIcon.imageOver);
        var handler_out = createMarkerOutHandler(selMarker, myIcon.imageOut);

        GEvent.addListener(selMarker, "click", function() { GEvent.trigger(marker, "click"); });
        GEvent.addListener(selMarker, "mouseout", handler_out);
        GEvent.addListener(selMarker, "mouseover", handler_over);

        gmap.addOverlay(selMarker);
        gmap.panTo(marker.getLatLng());
        //gmap.setZoom(marker.myParams['z']);


        if (markMarkerID != -1) {
            if (markMarkerVID == -1) {
                showDetailsBelow('../maps/' + context + 'Handlers.php?id=' + markMarkerID + "&city=" + lastCity['l'] + "&lat=" + lastCity['lt'] + "&lon=" + lastCity['ln'] + "&country=" + lastCity['ct'] + "&sub=" + contextShow);
            }
        }
        else if (markMarkerVID == -1) {
            document.getElementById('details').innerHTML = "";
            showDetailsBelow('../maps/' + context + 'Handlers.php?id=' + mrk.myParams['id'] + "&city=" + lastCity['l'] + "&lat=" + lastCity['lt'] + "&lon=" + lastCity['ln'] + "&country=" + lastCity['ct'] + "&sub=" + contextShow);
        }

        markMarkerID  = -1;
        markMarkerVID = -1;


    };

}




function LoadMarkersGMAP(doc, responseCode) {

    if (doc.indexOf("var") == -1) {
        alert('Error loading markers');
        //alert(doc);
        return;
    }

            LoadingDecrease();
            eval(doc);

            if (!markersJson.length && !findMarker)
                return;
            
			markers = [];

			var cm_baseIcon              = new GIcon();
			cm_baseIcon.iconSize         = new GSize(91, 91);
			cm_baseIcon.shadowSize       = new GSize(7, 4);
			cm_baseIcon.iconAnchor       = new GPoint(9, 34);
			cm_baseIcon.infoWindowAnchor = new GPoint(9, 2);
			cm_baseIcon.infoShadowAnchor = new GPoint(8, 5);

			if (!markerRangeFull) 
			{
			    if (zoomIDS[category][markerRangeStart] === undefined)
			        zoomIDS[category][markerRangeStart] = new Array();

			    if (zoomBNDS[category][markerRangeStart] === undefined)
			        zoomBNDS[category][markerRangeStart] = new Array();

			    zoomBNDS[category][markerRangeStart].push(gmap.getBounds());			    
			}
			else {
			    for (var z = markerRangeStart; z <= markerRangeEnd; z++)
			    { zoomRanges[category][z] = true; }
			}
			
			
			

			for (var i = 0; i < markersJson.length; i++) 
			{
			    var place = markersJson[i];
			    var markerOpts = {};

                // this markers has been added before for this zooming range => skip it
			    if (!markerRangeFull)
			    {
			        if (place === undefined)
                        continue;
 
			        if (zoomIDS[category][markerRangeStart][place["id"]] !== undefined)
			            continue;

			        zoomIDS[category][markerRangeStart][place["id"]] = 1;			    
			    }

			    var myIcon = new GIcon(cm_baseIcon);

			    if (category != 'general') {
			        place["zto"] = markerWindowOpenAt;
			    }
			    
			    
			        place["i"]   = "i.png";
			        place["imo"] = "imo.png"


			        myIcon.image            = BASE_URL + "/code/images/" + place["i"];
			        myIcon.imageOut         = BASE_URL + "/code/images/" + place["i"];
			        myIcon.imageOver        = BASE_URL + "/code/images/" + place["imo"];
			        myIcon.imageSelected    = BASE_URL + "/code/images/markerSEL.png";
			        myIcon.iconSize         = new GSize(18, 18);
			        myIcon.iconAnchor       = new GPoint(6, 14);
			        myIcon.infoWindowAnchor = new GPoint(9, 9);
			        markerOpts.icon         = myIcon;
			    

			    var posn = new GLatLng(place["lt"], place["ln"]);
			    var marker = new GMarker(posn, markerOpts);

			    marker.myParams = place;
			    marker.category = category;
			    marker.meMarker = false;
			    marker.options  = markerOpts;
			    

			    var handler = createMarkerClickHandler(marker);
			    GEvent.addListener(marker, "click", handler);
			    			    
			    var handler_over = createMarkerOverHandler(marker, myIcon.imageOver);
			    GEvent.addListener(marker, "mouseover", handler_over);

			    var handler_out = createMarkerOutHandler(marker, myIcon.imageOut);
			    GEvent.addListener(marker, "mouseout", handler_out);


			    markers.push(marker);

			    if (marker.category != 'general') {
			        allCatMarkers.push(marker);			    
			    }

			}


			mgr.addMarkers(markers, markerRangeStart, markerRangeEnd);
			mgr.refresh();


			if (findMarker == true) {
			    if (context != findMarkerCategory) {
			        ChangeContext(findMarkerCategory);
			    }

                ShowCategoryMarker();			        
			    findMarker = false;
			}

			if (category != 'general') {
			    RefreshCategoryMarkers();
			    //alert(mgr.getMarkerCount.getCount(gmap.getZoom()));
			}

            
			if (markMarkerID != -1) {
			    ShowDetails(markMarkerID);
			    markMarkerID = -1;			    
			}			
			
}   

function initializeGMAP(city, country, lat, lon, zoom, flickr) 
{

		if (GBrowserIsCompatible())
		{
		    if (gmap === undefined) 
		    {
		        // ==== Make the map types semi transparent ===
		        G_NORMAL_MAP.getTileLayers()[0].getOpacity = function() { return 0.6; };
		        G_PHYSICAL_MAP.getTileLayers()[0].getOpacity = function() { return 0.6; };
		        G_SATELLITE_MAP.getTileLayers()[0].getOpacity = function() { return 0.6; };
		        G_HYBRID_MAP.getTileLayers()[0].getOpacity = function() { return 0.6; };

		        gmap = new GMap2(document.getElementById("map_canvas"));
		        gmap.setCenter(new GLatLng(13, 0), initialZoomLevel);

		        //map.disableDragging();
		        gmap.enableDoubleClickZoom();
		        gmap.enableScrollWheelZoom();
		        gmap.disableContinuousZoom();

		        //gmap.addControl(new GLargeMapControl3D(), new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(10, 50)));


				gmap._lastCenter = gmap.getCenter();
		        GEvent.addListener(gmap, "moveend", ObtainMarkersIfNeededEvent);

				GEvent.addListener(gmap, 'moveend', function() { gmap._lastCenter = gmap.getCenter(); });
				GEvent.addListener(gmap, 'resize',  function() { gmap.panTo(gmap._lastCenter); }); 


		        // Overwrite the getMinimumResolution() and getMaximumResolution() methods
		        var mt = gmap.getMapTypes();
		        for (var i = 0; i < mt.length; i++) {
		            mt[i].getMinimumResolution = function() { return minZoomLevel; }
		            mt[i].getMaximumResolution = function() { return maxZoomLevel; }
		        }

		        mgr = new MarkerManager(gmap);

			if(city && country){
				lastCity = new Array();
				lastCity["id"] = 0;
				lastCity["l"] = city;
				lastCity["ct"] = country;
				lastCity["lt"] = lat;
				lastCity["ln"] = lon;
				lastCity["i"] = "markerME.png";
				lastCity["z"] = zoom;
				lastCity["f"] = lastCity["l"] + "dj party";
				lastCity["imo"] = "markerMEMO.png";
				SetMeMarker();
				setTimeout("GEvent.trigger(meMarker, 'click');", 300);
				ChangeLocationParamsMAP(city,country,lat,lon,zoom,flickr);
				
			}else{
		        	SetDefaultMeMarker();
		        }
		        gmap.setCenter(meMarker.getLatLng(), initialZoomLevel);
		        gmap.savePosition();

		        gdir = new GDirections(gmap, document.getElementById('gDirectionsMain'));

	            var reasons=[];
	            reasons[G_GEO_SUCCESS]            = "Success";
	            reasons[G_GEO_MISSING_ADDRESS]    = "Missing Address: The address was either missing or had no value.";
	            reasons[G_GEO_UNKNOWN_ADDRESS]    = "Unknown Address:  No corresponding geographic location could be found for the specified address.";
	            reasons[G_GEO_UNAVAILABLE_ADDRESS]= "Unavailable Address:  The geocode for the given address cannot be returned due to legal or contractual reasons.";
	            reasons[G_GEO_BAD_KEY]            = "Bad Key: The API key is either invalid or does not match the domain for which it was given";
	            reasons[G_GEO_TOO_MANY_QUERIES]   = "Too Many Queries: The daily geocoding quota for this site has been exceeded.";
	            reasons[G_GEO_SERVER_ERROR]       = "Server error: The geocoding request could not be successfully processed.";
	            reasons[G_GEO_BAD_REQUEST]        = "A directions request could not be successfully parsed.";
	            reasons[G_GEO_MISSING_QUERY]      = "No query was specified in the input.";
	            reasons[G_GEO_UNKNOWN_DIRECTIONS] = "Could not compute directions between the points.";

	            GEvent.addListener(gdir, "error", function() {
		            var code   = gdir.getStatus().code;
		            var reason = (reasons[code]) ? reasons[code] : "Code " + code;
		            alert("Failed to obtain directions, " + reason);
		        });

		        GEvent.addListener(gdir, "addoverlay", function() {
		            var cont = 'lo-content';
		            if (document.getElementById(cont) !== null) {
		                var clear = "<button value='clear directions' onClick='clearDirections();ShowCityPage();'>back</button><br/>";
		                document.getElementById(cont).innerHTML = clear + document.getElementById('gDirectionsMain').innerHTML + clear;
		            }


		        });

		        
		    } else 
		    {
		        mapResize();
		    }
		    
		}



  }

window.onload = function() {
	initializeGMAP();
}

window.resize = function() {
	initializeGMAP();
}



function GetCurrentURL() {
    return 'test';
}

function GetCurrentTITLE()
{
    return document.getElementById('showingNOW').innerHTML;
}


function ShareThis() {
    var shr = document.getElementById('at20mc');
    addthis_sendto();
    var div = document.getElementById('balloon-container');
    //alert(cont.innerHTML);

    //div.innerHTML = shr.innerHTML;
    return false;
}




function ChangeFilter(nFilter, filterOnly) {

    if (selMarker !== undefined) {
        gmap.removeOverlay(selMarker);
        selMarker = undefined;
    }


    var sFilter = nFilter.toUpperCase();

    if ( (context == "hostels") && (sFilter != "ALL") )
        sFilter = "TYPE: " + sFilter;

    if ((context == "hotels") && (sFilter != "ALL"))
        sFilter = "IMAGES/S" + sFilter.replace(/CLASS-/, "") + ".PNG";

    if ((context == "movies") && (sFilter != "ALL"))
        sFilter = " - " + sFilter;

    if ((context == "events") && (sFilter != "ALL"))
        sFilter = " - " + sFilter;

    for (var m = 0; m < allCatMarkers.length; m++) 
    {
        if (allCatMarkers[m].category == context) {

        var showMarker = ((sFilter == "ALL") || (allCatMarkers[m].myParams['l'].toUpperCase().indexOf(sFilter) != -1));
        
        if ((contextShow == 'events_today') && (allCatMarkers[m].myParams['t'].length) && (allCatMarkers[m].myParams['t'].toUpperCase().indexOf(sFilter) != -1))
            showMarker = true;

        if ((contextShow == 'events_upcoming') && (allCatMarkers[m].myParams['tu'].length) && (allCatMarkers[m].myParams['tu'].toUpperCase().indexOf(sFilter) != -1))
            showMarker = true;

        if (showMarker) {
            if (allCatMarkers[m].isHidden())
                allCatMarkers[m].show();
        }
        else if (!allCatMarkers[m].isHidden())
            allCatMarkers[m].hide();
    }
}

    if (filterOnly === undefined) {
        ForceRefreshGMAP();
        filter = nFilter;
        showDetailsBelow('');    
    }
}

function ChangeSort(nSort) {
    //alert(nSort);
    sort = nSort;
    showDetailsBelow('');
}


/* Prototyping the show/hide/isHidden methods of GMarker */


// the hide() method saves the markers current position and then 
// positions the marker outside the map
GMarker.prototype.hide = function() {
    if (this.getPoint().lat() < 90) {
        try {
            this.savePoint = this.getPoint();
            this.setPoint(new GLatLng(90, 0));
        } catch (e) { }
    }
}
// the show() method puts the marker back in the original position
GMarker.prototype.show = function() {
    if (this.getPoint().lat() == 90) {
        if (this.savePoint) {
            try {
                this.setPoint(this.savePoint);
                this.savePoint = null;
            } catch (e) { }
        }
    }
}

// the isHidden() method checks if the marker is put outside the map and if it does
// returns true
GMarker.prototype.isHidden = function() {
    if (this.getPoint().lat() == 90) {
        return true;
    } else {
        return false;
    }
} 

function MyCityGMAP(frm) 
{
	   lastCity = new Array();
	   lastCity["id"] = 0;
	   lastCity["l"]  = frm.where.value;
	   lastCity["ct"] = frm.country.value;
	   lastCity["lt"] = frm.centro_lat.value;
	   lastCity["ln"] = frm.centro_long.value;
	   lastCity["z"]  = frm.zoom.value;
	   lastCity["f"]  = frm.flickr.value;
	   SetMeMarker();
	   gmap.setCenter(meMarker.getLatLng(), lastCity["l"]);
}
