GOOGLEMAPS = function() {

    //global map object
    GOOGLEMAPS.prototype.map = null;
    GOOGLEMAPS.prototype.counter = 0;

    //default map settings
    GOOGLEMAPS.prototype.currentLat = 52.13263;
    GOOGLEMAPS.prototype.currentLng = 5.29127;
    GOOGLEMAPS.prototype.currentZoom = 0;
    GOOGLEMAPS.prototype.mapElement = "googlemap";
    GOOGLEMAPS.prototype.markers = new Array;
    GOOGLEMAPS.prototype.overlay = null;


    //try to load and show map
    GOOGLEMAPS.prototype.reloadMap = function() {


        //check if map object has been loaded or created
        try {
            document.getElementById(this.mapElement).innerHTML;
        } catch (e) {
            if (this.counter > 60) {
                alert('Can\'t load map! Can\'t find map object!');
            } else {
                setTimeout("gmaps.initMap()", 1000);
                this.counter++;
            }
            return false;
        }

        //If gmaps main.js didn't load try to call init again after 60 tries we give up
        if (typeof google.maps != "object") {
            if (this.counter > 60) {
                document.getElementById(this.mapElement).innerHTML = 'Can\'t load map! Gmap server timeout! ';
            } else {
                setTimeout("gmaps.initMap()", 1000);
            }
            this.counter++;
            return false;
        }

        //map center
        var startPos = new google.maps.LatLng(this.currentLat, this.currentLng);

        //setup map
        this.map = new google.maps.Map(document.getElementById(this.mapElement), {
            zoom: this.currentZoom,
            center: startPos,
            mapTypeId: google.maps.MapTypeId.TERRAIN,
            mapTypeControl: false,
            streetViewControl: false
        });

        //add zoomend event
        google.maps.event.addListener(this.map, 'zoom_changed', function() {
             try{
                document.getElementById('infoLabel').style.display='none';
            }catch(e){}
        });

       
        //add overlay
        this.overlay = new MAPOVERLAY();
        this.overlay.setMap(this.map);
    }

    //try to load and show map
    GOOGLEMAPS.prototype.initMap = function() {
        //debugger;
        if (this.map != null) return;

        this.reloadMap();
    }

    GOOGLEMAPS.prototype.clearOverlays = function() {

        this.markers = new Array();
    };


    GOOGLEMAPS.prototype.zoomToMarker = function(idx) {
        var latLng = new google.maps.LatLng(gmaps.markers[idx].lat, gmaps.markers[idx].lng);
        gmaps.map.setCenter(latLng);
        gmaps.map.setZoom(12);
    }

}


MAPOVERLAY = function() { }

MAPOVERLAY.prototype = new google.maps.OverlayView();
MAPOVERLAY.prototype.layer = null;
MAPOVERLAY.prototype.overlayProjection = null;

//add new layer to map pane when adding this ovelay
MAPOVERLAY.prototype.onAdd = function() {
    this.layer = document.createElement('DIV');
    this.getPanes().floatPane.appendChild(this.layer);
}

//this event is fired on init and zoom change
MAPOVERLAY.prototype.draw = function() {
    //determine zoom level and only show markers which zoom level idx is set
    if (gmaps.map.getZoom() > 11) zoomLevel = 2;
    else zoomLevel = 1;

    var html = '';

    //add each markers to map
    for (i in gmaps.markers) {
        marker = gmaps.markers[i];

        if (marker.zoom == zoomLevel) {
            //calculate marker postions
            this.overlayProjection = this.getProjection();
            marker.LatLng = new google.maps.LatLng(marker.lat, marker.lng);
            var pos = this.overlayProjection.fromLatLngToDivPixel(marker.LatLng);

            //build marker html
            html += '<a onmouseover="gmaps.overlay.showLabel(this,' + i + ')" onmouseout="gmaps.overlay.hideLabel()" ';
            if (marker.href != undefined) html += ' href="' + marker.href + '"';
            else html += ' href="#" onclick="gmaps.zoomToMarker(' + i + ')" ';
            html += ' style="z-index:2;position:absolute;left:' + (pos.x - 9) + 'px;top:' + (pos.y - 9) + 'px" class="' + marker.type + '">' + marker.txt + '</a>';
            if (/*@cc_on!@*/false) html += '<div style="filter: alpha(opacity=50);opacity:.5;border:0;background:#333;z-index:1;position:absolute;left:' + (pos.x - 5) + 'px;top:' + (pos.y - 5) + 'px" class="' + marker.type + '">&nbsp;</div>';

        }
    }

    //insert markers to map pane
    this.layer.innerHTML = html;
}

MAPOVERLAY.prototype.hideLabel = function() {
    document.getElementById('infoLabel').style.display = 'none';
}

//caculate label postion and show 
MAPOVERLAY.prototype.showLabel = function(m, idx) {

    //try to get label element if not in the body add it
    try {
        document.getElementById('infoLabel').innerHTML;
        var label = document.getElementById('infoLabel');
    } catch (e) {
        var label = document.createElement('div');
        label.setAttribute('id', 'infoLabel');
        label.style.position = "absolute";
        label.onclick = function() { marker.hidePointLabelElement() }
        document.body.appendChild(label);
    }

    //calculate absolute postion of the label
    var map = this.findPos(document.getElementById(gmaps.mapElement));
    var lY = (gmaps.map.getDiv().offsetHeight - (gmaps.map.getDiv().offsetHeight / 2 + this.overlayProjection.fromLatLngToDivPixel(gmaps.map.getCenter()).y - parseInt(m.style.top))) + map[1];
    var lX = (gmaps.map.getDiv().offsetWidth - (gmaps.map.getDiv().offsetWidth / 2 + this.overlayProjection.fromLatLngToDivPixel(gmaps.map.getCenter()).x - parseInt(m.style.left))) + map[0];

    //show label
    label.style.display = 'block';

    //set position
    label.style.top = (lY) + 'px';
    label.style.left = (lX + 25) + 'px';
    label.innerHTML = gmaps.markers[idx].label;
    label.setAttribute('class', gmaps.markers[idx].type);
    label.setAttribute('className', gmaps.markers[idx].type);

}

//helper function for calculating element positions
MAPOVERLAY.prototype.findPos = function(obj) {
    if (obj.offsetParent) {
        var curleft = obj.offsetLeft
        var curtop = obj.offsetTop
        while (obj = obj.offsetParent) {
            curleft += obj.offsetLeft
            curtop += obj.offsetTop
        }
        return [curleft, curtop];
    }
}



//create a new gmaps object
var gmaps = new GOOGLEMAPS;

