//Array.prototype.findIndex = function(v){ for (var i=0; i < this.length; i++) { if (this[i] == v) { return i; } } return false; };
//var IMAGES = ["purple", "yellow", "blue", "white", "green", "red", "black", "orange", "gray", "brown" ];
Array.prototype.max = function(){
    return Math.max.apply( null, this );
};
	
Array.prototype.min = function(){
    return Math.min.apply( null, this );
};

var NAMES = [];
var TYPES = [];
//var ICONS = [];
//var G_ACCURACY = ["Unknown location", "Country level accuracy", "Region level accuracy", "Sub-region level accuracy", "Town level accuracy", "Postal code level accuracy", "Street level accuracy", "Intersection level accuracy", "Address level accuracy"];
//var G_RESPONSE = {500:"A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known.",602:"No corresponding geographic location could be found for the specified address. This may be due to the fact that the address is relatively new, or it may be incorrect.",603:"The geocode for the given address or the route for the given directions query cannot be returned due to legal or contractual reasons."};
//var G_ACC_ZOOM = [5,5,7,9,11,13,15,16,16];

function load() {
  if (GBrowserIsCompatible()) {
    document.map = new GMap2(document.getElementById("map"));
    
    /**
    ** Base Map Layers Definition
    **/    
    
    var maplayers = G_NORMAL_MAP.getTileLayers();
    var maplayer = maplayers[0];

    var satlayers = G_HYBRID_MAP.getTileLayers();
    var satlayer = satlayers[0];
    
    var terrainlayers = G_PHYSICAL_MAP.getTileLayers();
    var terrainlayer = terrainlayers[0];

    function NaturalGetTileUrl(p,z) {
      return "http://www.data-spain.com/gmap/natural/Z" + z + "/" + p.y + "_" + p.x + ".jpg"; 
    }
    
    var naturallayer = new GTileLayer(new GCopyrightCollection("Shaded Relief &copy; maps.data-spain.com"),5,11);
      naturallayer.getTileUrl = NaturalGetTileUrl;
      naturallayer.getCopyright = function(a,b) {
      return {prefix:"Shaded Relief &copy; ", copyrightTexts : [ "maps.data-spain.com" ] };
    }

    function ContoursGetTileUrl(p,z) {
      return "http://www.data-spain.com/gmap/contours/Z" + z + "/" + p.y + "_" + p.x + ".png";
    }

    var contourslayer = new GTileLayer(new GCopyrightCollection("Contours &copy; maps.data-spain.com"),6,11);
      contourslayer.getTileUrl = ContoursGetTileUrl;
      contourslayer.getCopyright = function(a,b) {
      return {prefix:"Contours &copy; ", copyrightTexts : [ "maps.data-spain.com" ] };
    }

    /**
    ** Overlay Layers Definition
    **/    

    var roadlayer = satlayers[1];
        
    function PoliticalGetTileUrl(p,z) {
      return "http://www.data-spain.com/gmap/political/Z" + z + "/" + p.y + "_" + p.x + ".png"; 
    }
    
    var politicallayer = new GTileLayer(new GCopyrightCollection("Political Layer &copy; maps.data-spain.com"),5,13);
      politicallayer.getTileUrl = PoliticalGetTileUrl;
      politicallayer.isPng = function() {return true;};
      politicallayer.getCopyright = function(a,b) {
      return {prefix:"Political Layer &copy; ", copyrightTexts:["maps.data-spain.com"]};
    }
    
    function MallaGetTileUrl(p,z) {
      return "http://www.data-spain.com/gmap/malla/Z" + z + "/" + p.y + "_" + p.x + ".png"; 
    }
    function ParksGetTileUrl(p,z) {
      return "http://www.data-spain.com/gmap/protected/Z" + z + "/" + p.y + "_" + p.x + ".png"; 
    }
      
    var mallalayer = new GTileLayer(new GCopyrightCollection("Map Grids &copy; maps.data-spain.com"),8,13);
      mallalayer.getTileUrl = MallaGetTileUrl;
      mallalayer.getCopyright = function(a,b) {
      return {prefix:"Map Grids &copy; ", copyrightTexts:["maps.data-spain.com"]};
    }

    var parkslayer = new GTileLayer(new GCopyrightCollection("Parks &copy; maps.data-spain.com"),6,14);
      parkslayer.getTileUrl = ParksGetTileUrl;
      parkslayer.getCopyright = function(a,b) {
      return {prefix:"Parks &copy; ", copyrightTexts:["maps.data-spain.com"]};
    }

    /**
    ** Map Layers Arrays
    **/    

    var BASEMAPS = [
      null,
      {
        layer: maplayer,
        name:  'Map',
        min:   0,
        max:   17
      },
      {
        layer: satlayer,
        name:  'Satellite',
        min:   0,
        max:   19
      },
      {
        layer: terrainlayer,
        name:  'Terrain',
        min:   0,
        max:   15
      },
      {
        layer: naturallayer,
        name:  'Natural',
        min:   5,
        max:   11
      },
      {
        layer: contourslayer,
        name:  'Contours',
        min:   6,
        max:   11
      }
    ];

    var OVERLAYMAPS = [
      null,
      {
        layers: [politicallayer],
        name:   'Political',
        min:    5,
        max:    13
      },
      {
        layers: [roadlayer],
        name:   'Roadmap',
        min:    0,
        max:    17
      },
      {
        layers: [mallalayer],
        name:   'Map Grids',
        min:    8,
        max:    13
      },
      {
        layers: [parkslayer],
        name:   'Natural Parks',
        min:    6,
        max:    14
      },
      {
        layers: [roadlayer, politicallayer],
        name:   'Roadmap + Political Layer',
        min:    5,
        max:    13
      },
      {
        layers: [parkslayer, roadlayer],
        name:   'Natural Parks + Roadmap',
        min:    6,
        max:    14
      },
      {
        layers: [roadlayer, mallalayer],
        name:   'Roadmap + Map Grids',
        min:    8,
        max:    13
      }
    ];

    /**
    ** Nullifying Google's Default Map Types
    **/
    var t = document.map.getMapTypes();
    for(i in t){
      document.map.removeMapType(t[i]);      
    }
    
    /**
    ** Creating our map types
    **/
    var hierarchy = new GHierarchicalMapTypeControl();
    
    var p = BASEOVERLAYS.length;
    for(i = 1; i < p; i++) {
      if(i == 1) {
        var t = document.map.getMapTypes();
      }
      var b = BASEMAPS[i];
      var m = new GMapType([b.layer], G_NORMAL_MAP.getProjection(), b.name,{minResolution:b.min,maxResolution:b.max});
      document.map.addMapType(m);
      if(i == 1) {
        for(k in t){
          document.map.removeMapType(t[k]);
          document.map.setCenter(new GLatLng(opt.lat, opt.lng), opt.z);
        }
      }
      if(null == opt.overlay && i == opt.basemap) {
        document.map.setMapType(m);
      }      
      var q = BASEOVERLAYS[i].length;
      for(j = 0; j < q; j++) {
        var k = BASEOVERLAYS[i][j];
        var o = OVERLAYMAPS[k];
        //console.error(i,j,k); 
        try{
          var s = o.layers.length;
        } catch(err) {
          alert(i+','+j+','+k);
        }
        
        r = [];
        r.push(b.layer);
        for(f = 0; f < s; f++) {
          r.push(o.layers[f]);
        } 
        var n = new GMapType(r, G_NORMAL_MAP.getProjection(), o.name,{minResolution:Math.min(o.min,b.min), maxResolution:Math.max(o.max, b.max)});
        document.map.addMapType(n);
        hierarchy.addRelationship(m, n, o.name, false);
        if(k == opt.overlay && i == opt.basemap) {
          document.map.setMapType(n);
        }
      }
    }
    document.map.addControl(new GScaleControl());
    document.map.addControl(new GLargeMapControl());
    document.map.addControl(hierarchy);
    document.map.enableDoubleClickZoom();
  	document.map.enableContinuousZoom();
  }
}
