/**
 * Funkcje markerów
 *
 * @author Alfred Broda
 */

var mgr = null;
var opis_click = null;
var geoxml;
var curro;
var icon;
var icons = new Array();
var marker;
var mark;
var markers = new Array();

function checkMgr() {
    if (mgr == null) {
        if (cluster) {
            mgr = new MarkerClusterer(map,[],{
                maxZoom:    groupLevel,
                gridSize:   groupGrid
            });
        } else {
            mgr = new MarkerManager(map, {
                trackMarkers :true
            });
        }
    }
    if (opis_click == null) {
        opis_click = addListener(get_opis);
    }
}

function getIcon(image, size) {
    if (!size)
        size = 22;
    var ico = null;
    if (image) {
        ico = new GIcon();
        ico.image = basedir + size + "x" + size + "/" + image;
        ico.iconSize = new GSize(32, 32);
        ico.iconAnchor = new GPoint(11, 11);
        // ico.shadow = "http://www.google.com/mapfiles/shadow50.png";
        // ico.shadowSize = new GSize(37, 34);
        ico.infoWindowAnchor = new GPoint(16, 16);
        ico.infoShadowAnchor = new GPoint(32, 32);
        icons[image] = ico;
    }
    return ico;
}

function deleteMarker(id) {
    allmarkers.splice(id, 1);
    redrawMarkers();
}

function clearMarkers() {
    checkMgr();
    mgr.clearMarkers();
    allmarkers = new Array();
    redrawMarkers();
}

function setupMarkers() {
// map_show_icons(0);
}

/*
 * FIXME: Tworzenie pojedyńczego markera ze zmiennej globalnej oraz
 * wspólrzędnych. Po co to tutaj właściwie?
 */

var n = 1;

function addMarker(lat, lang) {
    checkMgr();
    point = new GLatLng(lat, lang);
    var opts = {
        title :curro.name
    };
    var marker = new GMarker(point, opts);
    // map.addOverlay(marker);
    contentDiv = document.createElement('div');
    // contentDiv.className = 'gpopup';
    contentDiv.id = curro.id;
    contentDiv.innerHTML = curro.desc;
    alldesc[curro.id] = contentDiv;
    var num = allmarkers.push(marker);
    marker.openInfoWindow(contentDiv);
}

/* Wypisywanie wszystkich markerów stacjonarnych */

var num;
var i = 0;
var managers = new Array();
var tags = new Array();
var manageGroups = true;
var groupLevel = 14;
var groupGrid = 40;

function makeMarkers(list) {
    checkMgr();
    allmarkers = Array();
    markers = Array();
    var posn;
    if (list.places.length && cluster && manageGroups ) {
        managers._each(function(mgrx){
            mgrx.clearMarkers();
            mgrx = null;
        });
        managers = Array();
    } 

    list.places._each( function(item) {
        posn = new GLatLng(item.posn[0], item.posn[1]);
        if (edit) {
            var tabs = edform(item);
            var gtabs = Array();
            var n = 0;
            tabs._each( function(tab) {
                gtabs[n] = new GInfoWindowTab(tab.label, tab.content);
                n++;
            });
            alldesc[item.id] = gtabs;
            GEvent.addListener(marker, "infowindowbeforeclose", function() {
                alert("Zmiany nie zostaną zapisane!");
            });
            item.mask = 0;
        } else {
            if (item.icon == "default.png")
                var ico = item.dicon;
            else
                var ico = item.icon;
        }
        if (item.mask == 1) {
            var icon = getIcon(item.dicon, 16);
            var opts = {
                icon :icon,
                title :item.sname,
                transparent :item.dicon
            };
            var mark2 = new GMarker(posn, opts);
            GEvent.addListener(mark2, "mouseover", function() {
                mark2.setImage(basedir + "32x32/" + item.icon);
            });
            GEvent.addListener(mark2, "mouseout", function() {
                if (map.getZoom() < item.izmax)
                    mark2.setImage(basedir + "16x16/" + item.dicon);
            });
            // FIXME: Możemy zduplikować id? Warto jakieś jednak mieć...
            mark2.id = item.id;
            // marker ma się pojawiać o poziom wyżej
            mark2.izmin = item.izmin;
            mark2.izmax = item.izmax - 1;
            var desc = document.createElement('div');
            desc.innerHTML = alldesc[item.id].innerHTML;
            desc.className = 'gpopup';
            mark2.bindInfoWindow(desc, maxopts);
            // Drugi marker będzie 'niżej' niż ten
            item.izmin = item.izmax;
            item.izmax = 17;
            var num = markers.push(mark2);
        } else {
            // jeżeli nie maskujemy to zapewne chcemy mieć markery w pełnym zakresie
            item.izmax = 17;
        }
        var icon = getIcon(item.icon, 32);
        var opts = {
            icon :icon,
            title :item.sname,
            transparent :item.icon
        };
        var marker = new GMarker(posn, opts);
        marker.id = item.id;
        marker.item = item;
        marker.izmin = item.izmin;
        marker.izmax = item.izmax;
        marker.mask = item.mask;
        /*
         * var desc = document.createElement('div'); var temp = opis;
         * desc.innerHTML = opis; desc.className = 'gpopup';
         */
        marker.desc = item.desc;

        if (markers[marker.id] == undefined) {
            markers[marker.id] = marker.id;
            // Łączenie w grupy
            if (cluster && manageGroups && item.tags.length) {
                item.tags._each(function (tag) {
                    if (tags[tag] == undefined){
                        tags[tag] = new Array();
                    }
                    tags[tag].push(marker);
                });
            } else {
                allmarkers.push(marker);
            }
        }
    });
    redrawMarkers();
}

function redrawMarkers() {
    if (cluster) {
        mgr.clearMarkers();
        mgr = new MarkerClusterer(map,Array(),{
            maxZoom:    groupLevel,
            gridSize:   groupGrid
        });

        if (manageGroups&& tags.length) {
            var i = 0;
            tags._each(function (tag) {
                if (managers[i] != undefined) {
                    managers[i].clearMarkers();
                }
                if (tag != undefined) {
                    var mgrx = new MarkerClusterer(map,tag,{
                        maxZoom:    groupLevel,
                        gridSize:   groupGrid
                    });
                    managers[i] = mgrx;
                    managers[i].redraw_();
                }
                i++;
            });
        }
    } else {
        checkMgr();
    }

    allmarkers._each( function(marker) {
        mgr.addMarker(marker, marker.izmin, marker.izmax);
    });

    if (!cluster) {
        mgr.refresh();
    } else {
        mgr.redraw_();
    }
}

/*
 * Umieszczna marker mobilny z wyszukaniem lokacji !! UWAGA !! Należy posyłać
 * małą ilość obiektów by Geocoder nie został zablokowany (status 500)!
 */

var point;

function makeMarker(list) {
    if (mark)
        map.removeOverlay(mark);
    var posn;
    // var dicon = getIcon(list.icon);
    var item = list.places[0]
    if (item.posn) {
        if (item.posn[0] == 0 && item.posn[1] == 0) {
            geocoder.getLocations(item.addr + ', Poland', function(resp) {
                if (resp && resp.Status.code == 200) {
                    out = resp;
                    place = resp.Placemark[0];
                    actx = place.Point.coordinates[0];
                    acty = place.Point.coordinates[1];
                }
            });
            item.posn[0] = actx;
            item.posn[1] = acty;
        }
    }
    if (item.zoom == 0)
        item.zoom = 12;
    // if (item.icon)
    // icon = getIcon(item.icon);
    // else {
    // icon = dicon;
    // item.icon = list.icon;
    // }
    posn = new GLatLng(item.posn[0], item.posn[1], item.zoom);
    var opts = {
        title :item.name,
        draggable :true
    };
    mark = new GMarker(posn, opts);
    GEvent.addListener(mark, 'dragend', function() {
        found(mark.getLatLng());
    });
    // mark.bindInfoWindowHtml(markerTab(item));
    map.addOverlay(mark, 0, 17);
    // allmarkers[item.id] = mark;
    /* Dodatki */
    actx = item.posn[0];
    acty = item.posn[1];
    actz = item.zoom;
    actico = item.icon;
    found(mark.getLatLng());
}

/* Tworzenie DIVa z zawartością zakłdki do dymku */
function markerTab(item) {
    var ret = document.createElement('div');
    ret.innerHTML = 'TODO: formularz obiektu ' + item.id;
    return ret;
}

