﻿// namespace
if(!Artem)
    var Artem = {};
if(!Artem.Web)
    Artem.Web = {};
//
// GoogleMapEntry
//
if(!Artem.Web.GoogleMapEntry) {
    // Constructor
    Artem.Web.GoogleMapEntry = function(elementId, lat, lng, zoom, traffic) {
        this._elementId = elementId;
        this._map = null;
        try {    
            if (GBrowserIsCompatible()) {
                this._map = new GMap2(document.getElementById(elementId));
                if(this._map) {
                    this._map.addControl(new GSmallMapControl());
                    this._map.addControl(new GMapTypeControl());
                    if(lat) {
                        var point = new GLatLng(lat, lng);
                        this._map.setCenter(point, zoom, G_HYBRID_MAP);
                    }
                    if(traffic)
                        this._map.addOverlay(new GTrafficOverlay());
                }
            }
        }
        catch(err) { }
    }
    Artem.Web.GoogleMapEntry.prototype.isEmpty = function() {
        return !(this._map);
    }
}    
//
// GoogleMap
//
if(!Artem.Web.GoogleMap) {
    Artem.Web.GoogleMap = {
        // fields
        _maps : new Array(),
        _geocoder : new GClientGeocoder(),
        // methods
        load: function(elementId, lat, lng, zoom, traffic) {
            Artem.Web.GoogleMap._maps[elementId] = new Artem.Web.GoogleMapEntry(elementId, lat, lng, zoom, traffic);
        },
        loadGeo: function(elementId, address, zoom, traffic) {
            var entry = new Artem.Web.GoogleMapEntry(elementId, null, null, zoom, traffic);
            Artem.Web.GoogleMap._geocoder.getLatLng(address, 
                function(point) { if(point)entry._map.setCenter(point, zoom, G_HYBRID_MAP); } 
            );
            Artem.Web.GoogleMap._maps[elementId] = entry;
        },
        setupMarker: function(elementId, lat, lng, text) {            
            var markerTemplate = document.getElementById(elementId);
            if(markerTemplate) {
                var point = new GLatLng(lat, lng);
                var content = markerTemplate.innerHtml;
                if(content)
                    content = content.replace("[%TEXT%]", text);
                else
                    content = text;
                var marker = new GMarker(point);  
                if(marker) {                    
                    GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(content); });  
                    var entry = Artem.Web.GoogleMap._maps[elementId];
                    if(entry._map) {
                        entry._map.addOverlay(marker);
                        marker.openInfoWindowHtml(content);
                    }
                }
            }
        },
        setupGeoMarker: function(elementId, address, text) {
            var markerTemplate = document.getElementById(elementId);
            if(markerTemplate) {
                Artem.Web.GoogleMap._geocoder.getLatLng(address,
                    function(point) {
                        if(!point)
                            return;
                        var content = markerTemplate.innerHtml;
                        if(content)
                            content = content.replace("[%TEXT%]", text);
                        else
                            content = text;
                        var marker = new GMarker(point);  
                        if(marker) {
                            GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(content); });  
                            var entry = Artem.Web.GoogleMap._maps[elementId];
                            if(entry._map) {
                                try {
                                    entry._map.addOverlay(marker);
                                    marker.openInfoWindowHtml(content);
                                }
                                catch(err) {  
                                    var buf="";                                    
                                    buf =  "Artem.Web.GoogleMap.setupGeoMarker('" + elementId + "','" + address + "','" + text + "');"
                                    setTimeout(buf, 1250); // callback in 1 second if an exception occurs because Google didn't return in time.
                                }
                            }
                        }
                    }
                );
            }
        },
        setupDirection: function(elementId, routePanelId, text) {
            var entry = Artem.Web.GoogleMap._maps[elementId];
            if(entry && entry._map) {
                var directionsPanel = document.getElementById(routePanelId);
                var directions = new GDirections(entry._map, directionsPanel);
                directions.load(text);
            }
        }
    }
}