GMapLoader = new Object({
    mapId: null,
    mapWindow: null,
    source: null,
    map: null,
    markers: null,
    goeCoder: null,
    icons: null,
    markers: null,
    xml: null,
    defaultZoom: 13,
    load: function(map, source)
    {
        if (GBrowserIsCompatible()) {
            this.source = source;
            this.map = map;
            this.geocoder = new GClientGeocoder();
            this.loadData();
        }
    },
    sleep: function(timeout) {
        var loop = true;
        var current = new Date();
        var now;
        var cTimestamp = current.getTime();

        while(loop) {
            now = new Date();
            nTimestamp = now.getTime();

            if(nTimestamp - cTimestamp > timeout) {
                    loop = false;
            }
        }

    },
    unload: function()
    {
        GUnload();
    },
    loadData: function()
    {
        var mapObj = this;
        GDownloadUrl(this.source, function(data) {
                mapObj.xml = GXml.parse(data);
                mapObj.loadMap();
                mapObj.loadIcons();
                mapObj.loadMarkers();
            }
        );
    },  
    loadMap: function()
    {
        if ( this.xml != null ) 
        {
            var xmlMaps = this.xml.documentElement.getElementsByTagName("map");
            var xmlMap = xmlMaps.item(0);
            if (  xmlMap.getAttribute("defaultZoom") != null &&  xmlMap.getAttribute("defaultZoom") != 'undefined')
                this.defaultZoom = parseInt(xmlMap.getAttribute("defaultZoom"));
            if ( xmlMap.getAttribute("address") != null && xmlMap.getAttribute("address") != 'undefined' )
            {
                var mapper = this;
                this.geocoder.getLocations(xmlMap.getAttribute("address"), 
                    function(response)
                    {
                        if (response && response.Status.code == 200) 
                            mapper.map.setCenter(new GLatLng(response.Placemark[0].Point.coordinates[1], response.Placemark[0].Point.coordinates[0]), mapper.defaultZoom);
                    }
                );
            }
            else if ( xmlMap.getAttribute("lat") != null && xmlMap.getAttribute("lng") != null )
                this.map.setCenter(new GLatLng(xmlMap.getAttribute("lat")),new GLatLng(xmlMap.getAttribute("lng")), this.defaultZoom);
            else
                this.map.setCenter(new GLatLng(0, 0), this.defaultZoom);
            if ( xmlMap.getAttribute("smallMapControl") != null && xmlMap.getAttribute("smallMapControl") != 'undefined' && xmlMap.getAttribute("smallMapControl") != 0 )
                this.map.addControl(new GSmallMapControl());
            if ( xmlMap.getAttribute("mapTypeControl") != null && xmlMap.getAttribute("mapTypeControl") != 'undefined' && xmlMap.getAttribute("mapTypeControl") != 0 )
                this.map.addControl(new GMapTypeControl());
            
        }
    },
    loadIcons: function()
    {
        if ( this.xml != null ) 
        {
            var xmlIcons = this.xml.documentElement.getElementsByTagName("icon");
            this.icons = [];
            for (var i = 0; i < xmlIcons.length; i++) 
                if ( xmlIcons.item(i).hasChildNodes() )
                {
                    var icon = new GIcon(); 

                    for ( var j = 0; j < xmlIcons.item(i).childNodes.length; j++ )
                    {
                        if ( xmlIcons.item(i).childNodes[j].tagName == 'image' )
                        {
                            icon.image = xmlIcons.item(i).childNodes[j].getAttribute("src");
                            icon.iconSize = new GSize(
                                xmlIcons.item(i).childNodes[j].getAttribute("width"), 
                                xmlIcons.item(i).childNodes[j].getAttribute("height")
                            );
                        }
                        else if ( xmlIcons.item(i).childNodes[j].tagName == 'shadow' )
                        {
                            icon.shadow = xmlIcons.item(i).childNodes[j].getAttribute("src");
                            icon.shadowSize = new GSize(
                                xmlIcons.item(i).childNodes[j].getAttribute("width"), 
                                xmlIcons.item(i).childNodes[j].getAttribute("height")
                            );
                        }
                        else if ( xmlIcons.item(i).childNodes[j].tagName == 'iconAnchor' )
                        {
                            icon.iconAnchor = new GPoint(                           
                                xmlIcons.item(i).childNodes[j].getAttribute("x"), 
                                xmlIcons.item(i).childNodes[j].getAttribute("y")
                            );
                        }
                        else if ( xmlIcons.item(i).childNodes[j].tagName == 'infoWindowAnchor' )
                        {
                            icon.infoWindowAnchor = new GPoint(                         
                                xmlIcons.item(i).childNodes[j].getAttribute("x"), 
                                xmlIcons.item(i).childNodes[j].getAttribute("y")
                            );
                        }
                    }
                    this.icons[parseInt(xmlIcons.item(i).getAttribute("id"))] = icon;
                }
        }
    },
    loadMarkers: function()
    {
        if ( this.xml != null ) 
        {
            var xmlMarkers = this.xml.documentElement.getElementsByTagName("marker");
            var mapper = this;
            mapper.next = true;
            for (var i = 0; i < xmlMarkers.length; i++) 
            {
                var name = xmlMarkers.item(i).getAttribute("name");
                var address = xmlMarkers.item(i).getAttribute("address");
                var type = xmlMarkers.item(i).getAttribute("icon");
                var lat = xmlMarkers.item(i).getAttribute("lat");
                var lng = xmlMarkers.item(i).getAttribute("lng");
                var description = xmlMarkers.item(i).firstChild.nodeValue;
                if ( lat != null && lng != null )
                {
                    mapper.createMarkerByPoint(name, lat, lng, description, this.icons[type]);
                }
                else 
                {
                    mapper.createMarker(name, address, description, this.icons[type]);
                }
            }
        }
    },
    createMarkerByPoint:  function(name, x, y, description, icon) {
        mapper = this;
        point = new GLatLng(x, y);
        
        var marker;
        if ( icon != null )
        {
            icon.infoWindowAnchor.x = parseFloat(icon.infoWindowAnchor.x);
            icon.infoWindowAnchor.y = parseFloat(icon.infoWindowAnchor.y);
            marker = new GMarker(point, icon);
        }
        else
            marker = new GMarker(point);
            
        GEvent.addListener(marker , 'click', function() {
            /*marker.openInfoWindowHtml(description);*/
			window.location = document.getElementById('bigMapUrl').innerHTML;
        });
        mapper.map.addOverlay(marker);

    },
    createMarker:  function(name, address, description, icon) {
        mapper = this;
        mapper.geocoder.getLocations(address, 
            function(response)
            {
                if (response && response.Status.code == 200) {
                    place = response.Placemark[0];
                    point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
                    
                    var marker;
                    if ( icon != null )
                    {
                        icon.infoWindowAnchor.x = parseFloat(icon.infoWindowAnchor.x);
                        icon.infoWindowAnchor.y = parseFloat(icon.infoWindowAnchor.y);
                        marker = new GMarker(point, icon);
                    }
                    else
                        marker = new GMarker(point);
                    
                    GEvent.addListener(marker , 'click', function() {
                        window.location = document.getElementById('bigMapUrl').innerHTML;
                    });
                    mapper.map.addOverlay(marker);
                }
            }
        );
    }
}
);

