var Map = function () {
	this.targetDiv = null;
};


Map.prototype.changeControlImg = function( imgUrl )
{
	this.targetDiv.childNodes[3].childNodes[0].src = imgUrl;    
}

Map.prototype.setLoadingElem = function(elem) {} // na wszelki
Map.prototype.loadIn = function(targetDiv,param)
{
    this.zoomw = 13;
    this.targetDiv = $(targetDiv);
    this.googleMap = new GMap2(this.targetDiv);
    this.mapStyle = this.targetDiv.firstChild.firstChild.style;
    
    
    this.frame = param.frame ? $(param.frame) : false;
    this.frameText = param.frameText ? $(param.frameText) : false;
    
    this.text_del = param.delete_msg; 
    this.text_zoom = param.zoom_msg; 
    this.text_ok = param.mark_msg;
    
        	
    if (this.mapStyle.cursor != '-moz-grab') this.browserIdCos = 1; else this.browserIdCos = 2;
    
    if (param.resizeType == 1) {
	this.googleMap.addControl(new GSmallMapControl());
    } 
    
    if (param.resizeType == 2) {
        this.googleMap.addControl(new GMapTypeControl());
    }
    
    if (param.resizeType == 3) {
	this.googleMap.addControl(new GLargeMapControl());
    }

    if (param.controls == 1) {
	this.googleMap.addControl(new GMapTypeControl());
    }
    
    if (param.controlImg)	
	this.changeControlImg(param.controlImg);
    
}

Map.prototype.center = function(lat,lng,zl)
{
	this.googleMap.setCenter(new GLatLng(lat,lng), zl);
}

Map.prototype.zoom = function(level)
{
	this.googleMap.setZoom(level);
}

Map.prototype.getzoom = function()
{
    return this.googleMap.getZoom();
}

Map.prototype.loadIcons = function(icons)
{
	this.icons = icons;
}

Map.prototype.addMarker = function(mid,lat,lng,iconNo,onClick,zl)
{
	if (iconNo) {// this.googleMap.fromLatLngToDivPixel(
		var m = new GMarker( new GPoint(lng,lat),{ icon: this.icons[iconNo] });
	} else {
		var m = new GMarker( new GPoint(lng,lat));	
	}
    
	m.zl = zl;
	m.mid = mid;
    m.oid = iconNo;
	
	if (onClick)
		GEvent.addListener(m,"click",onClick);
		
	if (this.manager) {
		this.manager.addMarker(m,0,zl);
	} else {
		this.googleMap.addOverlay(m);
	}
	return m;	
}

Map.prototype.addBoundsPath = function(bounds)
{
    var points = [];
    points.push(new GLatLng(bounds[1], bounds[0]));
    points.push(new GLatLng(bounds[1], bounds[2]));
    points.push(new GLatLng(bounds[3], bounds[2]));
    points.push(new GLatLng(bounds[3], bounds[0]));
    points.push(new GLatLng(bounds[1], bounds[0]));
    dupa_points = points;
    var poly = new GPolygon(points, '#3C3CFF', 2, 0.7, '#7F7FFF');
    //logDebug(poly);
    
    this.googleMap.addOverlay(poly);
}

Map.prototype.addMarkers = function(markers,onClick)
{
	for(var n=0;n<markers.length;n++)
    {
		this.addMarker(markers[n].id,markers[n].lat,markers[n].lng,markers[n].icon,onClick, markers[n].zl);
        if (markers[n].bounds)
            this.addBoundsPath(markers[n].bounds);
    }
}

// etap2
Map.prototype.addMarkersAndOpenOne = function(markers,userid,userURL)
{
    
    var nmarkers = [];
    
	for(var n=0;n<markers.length;n++) {
	    nmarkers[n] = this.addMarker(markers[n].id,markers[n].lat,markers[n].lng,markers[n].icon,0,markers[n].zl);
    }
    
    for(var n=0;n<markers.length;n++) {
	    if (markers[n].id == userid) {
	    	var xhr = new xhr.Request(userURL, {
				post: { id: userid }
			});
			xhr.addEventListener("complete", function (userInfoa) {
				if (userInfoa) {
				    if (typeof(nmarkers[n].openInfoWindow) == 'function') {
				        nmarkers[n].openInfoWindowHtml(userInfoa.htmltext);
				    } 
				}
			}, xhr.REQUEST_JSON);
			xhr.send();
            break;
        }
    }
}
    
Map.prototype.resize = function(points)
{
  var minLong = 999;
  var minLat = 999;
  var maxLong = -999;
  var maxLat = -999;

  var size = params.map.getSpanLatLng();
  var mapWidth = size.width;
  var mapHeight = size.height;
  var baseWidth = mapWidth;
  var baseHeight = mapHeight;

  if ( this.googleMap.getZoomLevel() > 0 ) {
    baseWidth /= Math.pow( 2, this.googleMap.getZoomLevel() );
    baseHeight /= Math.pow( 2, this.googleMap.getZoomLevel() );
  }

  for ( var i = 0; i < points.length; i++ ) {
    if ( points[i].x < minLong ) minLong = points[i].x;
    if ( points[i].x > maxLong ) maxLong = points[i].x;
    if ( points[i].y < minLat ) minLat = points[i].y;
    if ( points[i].y > maxLat ) maxLat = points[i].y;
  }

  var wZoom = 0;
  var w = Math.abs( maxLong - minLong );
  for ( var i = 1; i < 16; i++ ) {
    if ( baseWidth > w ) break;
    baseWidth *= 2;
    wZoom = i;
  }

  var hZoom = 0;
  var h = Math.abs( maxLat - minLat );
  for ( var i = 1; i < 16; i++ ) {
    if ( baseHeight > h ) break;
    baseHeight *= 2;
    hZoom = i;
  }

  this.googleMap.centerAndZoom(
    new GPoint( ( minLong + maxLong ) / 2, ( minLat + maxLat ) / 2 ),
    ( wZoom > hZoom ? wZoom : hZoom )
  );
}


Map.prototype.loadLocation = function(addr, companyId){
	var map = this;
	var postBody = 'company=' + companyId;
	new Ajax.Request(addr, {method:'post', postBody:postBody, onSuccess: function(t){
		if (t) {

			userLocation = eval('(' + t.responseText + ')');

			if (userLocation.lat != 0 && userLocation.lng != 0)
			{
				map.center(userLocation.lat,userLocation.lng,userLocation.zl);				
				map.locationMarker = map.addMarker(1,userLocation.lat,userLocation.lng,userLocation.icon,null,userLocation.zl);
				map.setZoom(userLocation.zl-3);
			}
			map.markerEditUpdateText();
			map.locationIcon = userLocation.icon;
		}																		
	}});	
}

Map.prototype.setLocation = function(lat, lng, zl, icon){
	var map = this;
	if (lat != 0 && lng != 0)
	{
		map.center(lat,lng,zl);				
		map.locationMarker = map.addMarker(1,lat,lng,icon,null,zl);
	//	map.setZoom(zl);
	}
	map.markerEditUpdateText();
	map.locationIcon = icon;	
}

Map.prototype.loadObjects = function(requestUrl,params)
{
    
    var map = this;
	//this.manager = new GMarkerManager(this.googleMap);
    var bounds = this.googleMap.getBounds();
    var bounds_str = bounds.getNorthEast().lng() + '+' + bounds.getNorthEast().lat() + '+' +
                        + bounds.getSouthWest().lng() + '+' + bounds.getSouthWest().lat();
    var oldbounds = this.oldBounds;
    var oldbounds_str = '';
    if (oldbounds)
    {
        oldbounds_str = oldbounds.getNorthEast().lng() + '+' + oldbounds.getNorthEast().lat() + '+' +
                        + oldbounds.getSouthWest().lng() + '+' + oldbounds.getSouthWest().lat();
    }
    
    var xhr = new xhr.Request(requestUrl, {
		get: { zl: this.googleMap.getZoom(), bounds: bounds_str + (oldbounds ? ('&oldbounds=' + oldbounds_str) : '') }
	});
	xhr.addEventListener("complete", function (users) {
		if (params.userid) {
		    map.addMarkersAndOpenOne(users,params.userid,params.userUrl);
		} else {
		    map.addMarkers(users,0);
		}
		map.resize(users);
		map.manager.refresh();
	}, xhr.REQUEST_JSON);
	xhr.send();
}

Map.prototype.loadUsers = function(requestUrl,params)
{
    return this.loadObjects(requestUrl,params);
}

Map.prototype.loadSingleObject = function(requestUrl,param)
{
        var map = this;
	this.manager = new GMarkerManager(this.googleMap);

	var xhr = new xhr.Request(requestUrl, {
		get: { zl: this.googleMap.getZoom() }
	});
	xhr.addEventListener("complete", function (users) {
		if (users) {
			var aa = Array();
			aa.push(users);
			
			        if (param.setZoom) {
			            map.googleMap.setZoom(users.zl);
			        } else {
	    	            map.googleMap.setZoom(users.zl-3);
			        }
			
				map.googleMap.panTo(new GLatLng(users.lat,users.lng));
			map.addMarkers(aa,0);
		}
		map.manager.refresh();
	}, xhr.REQUEST_JSON);
	xhr.send();
}
Map.prototype.loadSingleUser = function(requestUrl,param)
{
    return this.loadSingleObject(requestUrl,param);
}



Map.prototype.miniMap = function(redirectUrl)
{ 
	GEvent.bind(this.googleMap, "click", this, function(overlayx,pointx) {
        if (overlayx) {
		    if (typeof(overlayx.openInfoWindow) == 'function') {
                var zl = overlayx.zl;
                var lat = overlayx.getPoint().lat();
                var lng = overlayx.getPoint().lng();
                var uid = overlayx.mid;
                var oid = overlayx.oid;
                
                document.location = redirectUrl + '?zl=' + zl + '&lat=' + lat + '&lng=' + lng + '&uid=' + uid+ '&oid='+ oid;
            }
		} else {
            document.location = redirectUrl;
        }
	});	
}

Map.prototype.miniSearch = function(searchText)
{
    var loc = 'http://'+document.location.host+'/maps/friends/';
    loc += '?s='+urlEncode(searchText);
    document.location = loc;
}

Map.prototype.usersResize = function(users)
{
    // { uid: 1525, lat: 10, lng: 10, icon:10, zl : 10 }
    
    var map = this;
	var bounds = new GLatLngBounds();
    
    for(var n=0;n<users.length;n++) {
        var marker = this.addMarker(users[n].uid,users[n].lat,users[n].lng,users[n].icon,null,users[n].zl);
        bounds.extend(marker.getPoint());
    }
    
    var zl = this.googleMap.getBoundsZoomLevel(bounds);
    var center = bounds.getCenter();
    this.center(center.lat(),center.lng(),zl-1);
}

Map.prototype.browserId = function()
{
    return this.browserIdCos;
}

Map.prototype.changeCursor = function( map,params )
{
    if (map.browserId() == 2) {
            
            map.googleMap.C.setDraggingCursor(params.nameDragging);
            map.googleMap.C.setDraggableCursor(params.namePointing);
            
    } else {
            map.googleMap.C.setDraggingCursor(params.urlDragging);
            map.googleMap.C.setDraggableCursor(params.urlPointing);
            
    }
}

Map.prototype.fixCursors = function() 
{
    if (this.getzoom() > 10) {
           this.changeCursor(this,GMCursorsStamp);
	} else {
           this.changeCursor(this,GMCursors);
	}
}

Map.prototype.changeCursorOld = function( params )
{
    if (params.name) {
        params.map.mapStyle["cursor"] = params.name
    } else {
        params.map.mapStyle["cursor"] = "url("+params.url+"), default";
    }
}
