/*!
 * MapSpread by Stefan Wehrmeyer
 * http://stefanwehrmeyer.com/
 * 
 * Licensed unter cc-by-sa 3.0 de
 * Date: 15.09.2009
 */
 function MapSpread(){
    this.areadata = [];
    this.overlays = [];
    this.LOCK = false;
    this.maxZoomLevel = 13;
    this.env = {"northwest": new GLatLng(52.232846, 12.436523), "southeast": new GLatLng(52.832846, 14.041523),
      "width": 800, "height": 470, "rows": 121, "cols": 322, "ex": 1, "ey": 1, "slideValue": 30};
    this.sliderId = "slider";
    this.time_span = "time_span";
    
    this.map = new google.maps.Map2(document.getElementById("map"));
    this.map.setCenter(new google.maps.LatLng(52.531083500000001, 13.238524999999999), 9);
    this.map.addControl(new GSmallMapControl());
    this.map.addControl(new GMapTypeControl());
    this.elabel = new ELabel(this.env.northwest, '<canvas id="canvas" width="585" height="360"></canvas>',null,new GSize(0,0));
    this.map.addOverlay(this.elabel);
    this.canvas = document.getElementById("canvas");
    if(!this.canvas.getContext){
      this.ctx = null;
      return;
    }
    this.ctx = this.canvas.getContext("2d");
    var obj = this;
    GEvent.addListener(this.map, "zoomend", function(oldLevel, newLevel){
        if(newLevel>obj.maxZoomLevel){
          obj.map.setZoom(obj.maxZoomLevel);
          return;
        }
        obj.setScale();
        obj.redraw();
    });
    $("#"+this.sliderId).slider({ min: 0, max: 200,
       slide: function(e, ui){obj.updateOverlays.apply(obj, [e, ui]);}, stop: function(e, ui){obj.updateOverlays.apply(obj, [e, ui]);}, 
       value: this.env["slideValue"]
    });
}

MapSpread.prototype = {

    setScale : function(){
        this.ctx.clearRect(0,0,this.env["width"], this.env["height"]);
        var nw = this.map.fromLatLngToDivPixel(this.env.northwest);
        var se = this.map.fromLatLngToDivPixel(this.env.southeast);
        this.env["width"] = Math.abs(se.x - nw.x);
        this.env["height"] = Math.abs(se.y - nw.y);
        this.canvas.width = this.env["width"];
        this.canvas.height = this.env["height"];
        this.env["ex"] = this.env["width"]/this.env["cols"];
        this.env["ey"] = this.env["height"]/this.env["rows"];
    },
    loadJSON : function(){
        var color;
        var oldX=null;
        var nx = 0;
        var ny = 0;
        for (var i=0;i<MAPSPREAD_AREAS.length;i++){
            var x = MAPSPREAD_AREAS[i][0];
            var y = MAPSPREAD_AREAS[i][1];
            var d = MAPSPREAD_AREAS[i][2];
            if(d == 999){color = "rgba(128,128,128,0.5)";}
            else {color = "rgba(0,200,0,0.5)";}
            if(oldX === null){oldX = x;}
            if(oldX !== x){
                nx=nx+1;
                ny=0;
                oldX=x;
            }
            this.overlays.push([nx, this.env["rows"]-ny, color]);
            this.areadata.push(d);
            ny=ny+1;
        }
    },
    drawDefaultOverlays : function(){
        var latlng = new GLatLng(52.392573, 13.129692);
        var marker = new GMarker(latlng);
        this.map.addOverlay(marker);
        GEvent.addListener(marker, "click", function() {
             marker.openInfoWindowHtml("Hasso-Plattner-Institut");
           });
        $("#"+this.time_span).text(this.env["slideValue"]);
    },
    redraw : function(){
        this.elabel.redraw();
        this.ctx.clearRect(0,0,this.env["width"], this.env["height"]);
        for (var i=0; i< this.areadata.length; i++){
            if(this.areadata[i]==999){
              this.drawArea(i);            }
            if (this.areadata[i] <= this.env["slideValue"]){
              this.drawArea(i);
            }
        }
    },
    updateOverlays : function(e, ui){
        if (this.LOCK){return;}
        this.LOCK = true;
        var value = ui.value;
        $("#"+this.time_span).text(value);
        for (var i=0; i< this.areadata.length; i++){
            if(this.areadata[i] == 999){continue;}
            if (this.areadata[i] <= value && this.areadata[i] > this.env["slideValue"]){
              this.drawArea(i);
            } else if (this.areadata[i] > value && this.areadata[i] <= this.env["slideValue"]){
              this.clearArea(i);
            }
        }
        this.env["slideValue"] = value;
        this.LOCK = false;
  },
  drawArea : function(i){
    this.ctx.strokeStyle = this.overlays[i][2];
    this.ctx.fillStyle = this.overlays[i][2];
    this.ctx.fillRect(this.overlays[i][0]*this.env["ex"], this.overlays[i][1]*this.env["ey"], this.env["ex"], this.env["ey"]);
/*    this.ctx.beginPath();
    this.ctx.arc(this.overlays[i][0]*this.env["ex"], this.overlays[i][1]*this.env["ey"], this.env["ex"], 0, Math.PI*2, true);
    this.ctx.fill();*/
  },
  clearArea : function(i){
    this.ctx.clearRect(this.overlays[i][0]*this.env["ex"], this.overlays[i][1]*this.env["ey"], this.env["ex"], this.env["ey"]);
  }
};

var mapspread;

init_mapspread = function(){
  $(window).unload(GUnload);
  mapspread = new MapSpread();
  if(mapspread.ctx == null){
    alert("Your browser seems to suck, no canvas support! I can't work that way...");
    return;
  }
  mapspread.setScale();
  mapspread.loadJSON();
  mapspread.redraw();
  mapspread.drawDefaultOverlays();
};