
var CGMap = function(_Data){
    var _Map = null;
    var _Markers = [];

    var _init = function(){
        _Map = new GMap2($(_Data.Holder).get(0));
        _Map.addControl(new GSmallMapControl());
        _Map.addControl(new GMapTypeControl());
        if(_Data.Center) _Map.setCenter(_Data.Center, 15);
        return _Map;
    }
    
    this.markers = function(Data){
        for(var I in _Markers) _Markers[I].remove();
        for(I=0; I<Data.length; I++){
            _Markers.push(new CGMapIcon(Data[I], _Map));
        }
    }

    _init();
}

var CGMapIcon = function(_Data, _Map){
    var _Base = {};
    _Base.iconSize = new GSize(45, 36);
    _Base.iconAnchor = new GPoint(9, 34);
    _Base.infoWindowAnchor = new GPoint(9, 2);
    var _Marker = {};
    var _Popup = null;

    var _init = function(){
        var Icon = new GIcon(_Base);
        Icon.image = "/content/images/locationMarker_professional.png";
        if (_Data.Type == 'Trade') Icon.image = "/content/images/locationMarker_trade.png";
        if (_Data.Type == 'Retail') Icon.image = "/content/images/locationMarker_retail.png";
        var noaddress = function(){
            //alert(_Data.Adress + " not found");
        }
        var create = function(Point){
            if(!Point){
                noaddress();
                return;
            }
            _Marker = new GMarker(Point, {icon: Icon});
            _Map.addOverlay(_Marker);
            GEvent.addListener(_Marker, "click", _click);
            GEvent.addListener(_Marker, "mouseover", _over);
            GEvent.addListener(_Marker, "mouseout", _out);
            _Map.setCenter(Point, 15);
            _createPopup();
        }
        if(_Data.lat &&  _Data.lng){
            var Point = new GLatLng(_Data.lat, _Data.lng);
            create(Point);
        }
        else{
            var Geocoder = new GClientGeocoder();
            if (Geocoder) {
                Geocoder.getLatLng(_Data.Adress, create);
            }
            else{
                noaddress();
            }
        }
    }
    var _createPopup = function(){
        var Html = '<div class="CPopup '+_Data.Type+'">'+
                    '<h4><a href="' + _Data.Profile + '">' + _Data.Name + '</a> <em>(' + _Data.Type + ')</em></h4>' +
                    '<p><strong>Address: </strong>' + _Data.Adress + '</p>' +
                    '</div>';
        _Popup = new CHover($(_Marker.bt), $(Html).appendTo(document.body));
    }
    var _click = function(){
    }
    var _over = function(){
        var Img = $(this.bt);
        Img.appendTo(Img.parent());
    }
    var _out = function(){
    }

    this.remove = function(){
        if(_Marker) _Marker.remove();
    }
    this.marker = function(){
        return _Marker;
    }

    _init();
}
/*
 * Dropdown menu could also be used as hover tip.
 *
 * @author Denis Zenkovich
 */
var CHover = function(_Trig, _Drop, _Type, _Parent){
    var _Delay = null;
    var _Shown = false;
    var _Forced = false;
    var _MouseOver = false;

    var _init = function(){
        if(!_Trig) throw "Hover must have a trigger element";
        if(!_Drop) throw "Hover must have a drop down element";
        if(!_Type) _Type = 'right';
        if(typeof _Trig == 'string') _Trig = $('#'+_Trig);
        if(typeof _Drop == 'string') _Drop = $('#'+_Drop);
        _Trig.mouseover(function(){_MouseOver=true; _show();}).mouseout(function(){_MouseOver=false; _hide();});
        _Drop.mouseover(function(){_MouseOver=true; _show();}).mouseout(function(){_MouseOver=false; _hide();}).appendTo(document.body);
    };
    var _position = function(){
        var P, T, L;
        P = _Trig.offset();
        if(_Type == 'right'){
            T = P.top;
            L = P.left + _Trig.width();
        }
        if(_Type == 'bottom'){
            T = P.top + _Trig.height();
            L = P.left;
        }
        _Drop.css({top: T, left: L});
    };
    var _show = function(){
        window.clearTimeout(_Delay);
        if(_Shown) return;
        _position();
        _Drop.fadeIn(200);
        if(_Parent){
            _Parent.force(true);
            _Parent.show();
        }
        _Shown = true;
    };
    var _hide = function(){
        if(_Forced) return;
        if(_MouseOver) return;
        var close = function(){
            _Shown = false;
            if(_Parent){
                _Parent.force(false);
                _Parent.hide();
            }
            _Drop.fadeOut(200);
        };
        _Delay = window.setTimeout(close, 200);
    };

    this.force = function(Val){
        _Forced = Val?Val:!_Forced;
    };
    this.show = function(){
        _show();
    };
    this.hide = function(){
        _hide();
    };
    _init();
}