
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) {
        _Map.MarkerBounds = new GLatLngBounds();
        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.shadow = '/content/images/locationMarker_shadow.png';
    _Base.shadowSize = new GSize(53, 46);
    _Base.iconSize = new GSize(38, 43);
    _Base.iconAnchor = new GPoint(0, 0);
    _Base.infoWindowAnchor = new GPoint(0, 0);
    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.Address + " 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.MarkerBounds.extend(Point);
            _Map.setCenter(_Map.MarkerBounds.getCenter(), _Map.getBoundsZoomLevel(_Map.MarkerBounds));
            _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.Address, 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.Address + '</p>' +
	            '</div>';
        //get image object of the marker
        var Img = null;
        for (var I in _Marker) {
            if (_Marker[I].tagName && _Marker[I].tagName.toLowerCase() == 'img') {
                Img = _Marker[I];
                break;
            }
        }
        _Popup = new CHover($(Img), $(Html).appendTo(document.body));
        $(Img).parent().find('img').css('z-index', '');
    }
    var _click = function () {
    }
    var _over = function () {
        //get image object of the marker
        var Img = null;
        for (var I in _Marker) {
            if (_Marker[I].tagName && _Marker[I].tagName.toLowerCase() == 'img') {
                Img = $(_Marker[I]);
                break;
            }
        }
        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();
}
