/*global define */
define(['jquery', 'underscore', 'backbone', 'gmaps'],
function($, _, Backbone, gmaps) {
'use strict';
var Map = Backbone.Model.extend(
/** @lends Map.prototype */{
// This model contains all of the map settings used for searching datasets
defaults: function(){
var model = this;
return {
map: null,
//The options for the map using the Google Maps API MapOptions syntax
mapOptions:
(gmaps)?
{ zoom: 2,
minZoom: 2,
maxZoom: 16,
center: new google.maps.LatLng(45, -98),
disableDefaultUI: true,
zoomControl: true,
zoomControlOptions: {
style: google.maps.ZoomControlStyle.LARGE,
position: google.maps.ControlPosition.LEFT_CENTER
},
panControl: false,
scaleControl: true,
streetViewControl: false,
mapTypeControl: true,
mapTypeControlOptions:{
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
mapTypeIds: [google.maps.MapTypeId.SATELLITE, google.maps.MapTypeId.TERRAIN],
position: google.maps.ControlPosition.LEFT_BOTTOM
},
mapTypeId: google.maps.MapTypeId.TERRAIN,
styles: [{"featureType":"water","stylers":[{"visibility":"on"},{"color":"#b5cbe4"}]},{"featureType":"landscape","stylers":[{"color":"#efefef"}]},{"featureType":"road.highway","elementType":"geometry","stylers":[{"color":"#83a5b0"}]},{"featureType":"road.arterial","elementType":"geometry","stylers":[{"color":"#bdcdd3"}]},{"featureType":"road.local","elementType":"geometry","stylers":[{"color":"#ffffff"}]},{"featureType":"poi.park","elementType":"geometry","stylers":[{"color":"#e3eed3"}]},{"featureType":"administrative","stylers":[{"visibility":"on"},{"lightness":33}]},{"featureType":"road"},{"featureType":"poi.park","elementType":"labels","stylers":[{"visibility":"on"},{"lightness":20}]},{},{"featureType":"road","stylers":[{"lightness":20}]}]
}
: null,
//Set to true to draw markers where tile counts are equal to 1. If set to false, a tile with the count "1" will be drawn instead.
drawMarkers: false,
//If this theme doesn't have an image in this location, Google maps will use their default marker image
markerImage: "./js/themes/" + MetacatUI.theme + "/img/map-marker.png",
//Keep track of the geohash level used to draw tiles on this map
tileGeohashLevel: 1,
///****** MAP TILE OPTIONS **********//
//The options for the tiles. Using Google Maps Web API
tileOptions: {
fillOpacity: 0.2,
strokeWeight: 1,
strokePosition: (typeof google != "undefined")? google.maps.StrokePosition.INSIDE : "",
strokeOpacity: 1
},
//The options for the tiles when they are hovered on. Using Google Maps Web API
tileOnHover: {
fillOpacity: 0.8,
strokeColor: "#FFFF00",
strokePosition: (typeof google != "undefined")? google.maps.StrokePosition.INSIDE : "",
strokeWeight: 1,
strokeOpacity: 1,
fillColor: "#FFFF66"
},
//The options for the tile text
tileLabelColorOnHover: '#000000',
tileLabelColor: '#444444',
//The tile hue - the number of the hue that will be used to color tiles
//Tile lightness - percent range of lightness/brightness of this tile hue
tileHue: model.tileHue || "231",
tileLightnessMax: 100,
tileLightnessMin: 30
}
},
initialize: function(options){
if(typeof options == "object"){
if(options.tileHue) this.tileHue = options.tileHue;
}
},
isMaxZoom: function(map){
var zoom = map.getZoom(),
type = map.getMapTypeId();
if(zoom >= this.get("mapOptions").maxZoom) return true;
else return false;
},
/**
* This function will return the appropriate geohash level to use for mapping geohash tiles on the map at the specified zoom level.
*/
determineGeohashLevel: function(zoom){
var geohashLevel;
switch(zoom){
case 0: // The whole world zoom level
geohashLevel = 2;
break;
case 1:
geohashLevel = 2;
break;
case 2:
geohashLevel = 2;
break;
case 3:
geohashLevel = 2;
break;
case 4:
geohashLevel = 2;
break;
case 5:
geohashLevel = 3;
break;
case 6:
geohashLevel = 3;
break;
case 7:
geohashLevel = 4;
break;
case 8:
geohashLevel = 4;
break;
case 9:
geohashLevel = 4;
break;
case 10:
geohashLevel = 5;
break;
case 11:
geohashLevel = 5;
break;
case 12:
geohashLevel = 6;
break;
case 13:
geohashLevel = 6;
break;
case 14:
geohashLevel = 7;
break;
case 15:
geohashLevel = 7;
break;
case 16:
geohashLevel = 7;
break;
case 17:
geohashLevel = 8;
break;
case 18:
geohashLevel = 9;
break;
case 19:
geohashLevel = 9;
break;
case 20:
geohashLevel = 9;
break;
default: //Anything over (Gmaps goes up to 19)
geohashLevel = 9;
}
return geohashLevel;
},
getSearchPrecision: function(zoom){
if(zoom <= 5) return 2;
else if(zoom <= 7) return 3;
else if (zoom <= 11) return 4;
else if (zoom <= 13) return 5;
else if (zoom <= 15) return 6;
else return 7;
},
/*
* Creates a LatLng Google Maps object based on the given latitude and longitude
*/
createLatLng: function(lat, long){
return new google.maps.LatLng(parseFloat(lat), parseFloat(long));
},
clear: function() {
return this.set(_.clone(this.defaults()));
}
});
return Map;
});