/**
* Initialisation stuff
*/

var maiaApp;
var flash;
var geocoder;
var upperLeftCornerX;
var upperLeftCornerY;
var lowerRightCornerX;
var lowerRightCornerY;

var p_adress_1;
var p_adress_2;
var p_zip_code;
var p_city;
var p_country;
var p_regionId;

var p_autoZoom;
var initX;
var initY;
var partnerViewer;
var init = true;
var poiList;

var levels = Array(
  0.5,
  1,
  3,
  8,
  25,
  100,
  350,
  1050,
  3500     
);
    
var lim53003 = 6;

function WGSPlusMeters(coordWGS, dxMeter, dyMeter) {

  var EARTH_RADIUS = 6378137;
  var EARTH_RADIUS2 = 6356752.314;

  var SQR_EARTH_RADIUS = EARTH_RADIUS * EARTH_RADIUS;
  var SQR_EARTH_RADIUS2 = EARTH_RADIUS2 * EARTH_RADIUS2;

  
  var PI = 3.14159265;

  var dlat_rad = dyMeter / EARTH_RADIUS; // in radian
  var tany2 = Math.tan(coordWGS.y * PI / 180);
  tany2 = tany2 * tany2;
  var dlon_rad = ( dxMeter * Math.sqrt( SQR_EARTH_RADIUS +  ( SQR_EARTH_RADIUS2 * tany2 ) ) ) / SQR_EARTH_RADIUS;
  
  var res = new Coordinates(
    coordWGS.x + dlon_rad * 180 / PI,
    coordWGS.y + dlat_rad * 180 / PI,
    coordWGS.radius,
    "wgs84");

  return res;
}
	
function setBoundsFromCentre(evt, largeurCarte, hauteurCarte) {

   if (largeurCarte == undefined ) {
     largeurCarte = 300;
   }
   if (hauteurCarte == undefined ) {
     hauteurCarte = 300;
   }
   var dx = Math.abs(levels[evt.coordinates.radius - 1])*largeurCarte;
   var dy = Math.abs(levels[evt.coordinates.radius - 1])*hauteurCarte;
   
   var ul = WGSPlusMeters(evt.coordinates, -dx, dy );
   var lr = WGSPlusMeters(evt.coordinates, dx, -dy );
       
   evt.upperLeftCorner = ul;
   evt.lowerRightCorner = lr;
}

function initMap(){
  flash = FlashWrapper.getInstance("Maia");
  maiaApp.addDefaultTools();
  var mapTool = new BaseMapTool(flash);
  maiaApp.addTool(mapTool);
  maiaApp.addTool(new DnDPanTool(flash));
  maiaApp.addTool(new WheelZoomTool(flash));
  
  var listener = flash.createProxy('onCoordinateChangeProxy');
  listener.defineFunction('onMaiaMapCoordinateChange');
  listener.onMaiaMapCoordinateChange = function(evt){
      setBoundsFromCentre(evt);
      var bounds = {
        upperLeftCorner : evt.upperLeftCorner,
        lowerRightCorner : evt.lowerRightCorner
      };
      setCorners(bounds);
      updateCoordinates(p_address_1, p_address_2, p_zip_code, p_city, p_country, p_regionId, partners_attribute_1, partners_attribute_2, partners_attribute_3, partners_attribute_4, upperLeftCornerX, upperLeftCornerY, lowerRightCornerX, lowerRightCornerY, partnerViewer, p_autoZoom);
	};
  
  maiaApp.getMapModel().addListener(listener);
  
  var poiListener = flash.createProxy('poiListenerProxy');
  poiListener.defineFunction("onPOIIconRelease");
  poiListener.onPOIIconRelease = function(evt){
    var poi = evt.poi;
    var poiId = poi.getID().split("#")[1];
    var nextPage = p_partner_viewer + "p_partnerId=" + poiId;
    window.location = nextPage;
  };
  maiaApp.addPOIListener(poiListener);
  
  if (init) { init = false; maiaApp.navigateTo(initX, initY); }
}

function drawMap(token, coordinateX, coordinateY, pPartnerViewer, sizeX, sizeY, auto_zoom){
  if (init) { initX = coordinateX; initY = coordinateY; partnerViewer = pPartnerViewer; p_autoZoom = auto_zoom; poiList = new Array();}
  maiaApp = new MaiaApp("Maia","m1",token,initMap, {displayWidth:sizeX, displayHeight:sizeY, x:coordinateX, y:coordinateY,radius:5});
}

function drawCascadingMap(token, map, sizeX, sizeY){
  maiaApp = new MaiaApp("Maia","m1",token,onCascadingMaiaInit, {intro:map,introBackgroundColor : 0xF0F0F0, introWidth : 350, displayWidth:sizeX, displayHeight:sizeY});
}

/**
* Functions
*/

function zoomOnPOICanvas() {
  var geoExt = maiaApp.getPOICanvas().getGeographicExtent();
  if ( (geoExt.upperLeftCorner.x == null ) || (geoExt.upperLeftCorner.y == null ) || 
    (geoExt.lowerRightCorner.x == null ) || (geoExt.lowerRightCorner.y == null ) )
    return;
  var rect = new MRectangleShape(geoExt.lowerRightCorner, geoExt.upperLeftCorner, flash);
  maiaApp.addShape(rect);
  rect.setFillStyle(null); // An empty color, to see what's behind the rectangle !
  maiaApp.bestView(geoExt.upperLeftCorner, geoExt.lowerRightCorner);
}

function setCorners(bounds){
  upperLeftCornerX = bounds.upperLeftCorner.x;
  upperLeftCornerY = bounds.upperLeftCorner.y;
  lowerRightCornerX = bounds.lowerRightCorner.x;
  lowerRightCornerY = bounds.lowerRightCorner.y;
}

function isInsideBounds(x, y, bounds){
  xLT = bounds.upperLeftCorner.x;
  yLT = bounds.upperLeftCorner.y;
  xRB = bounds.lowerRightCorner.x;
  yRB = bounds.lowerRightCorner.y;
  if (x < xLT || x > xRB){
    return false;
  }
  else if (y < yRB || y > yLT){
    return false;
  }
  else return true;
}


function isVisible(x, y){
  xLT = maiaApp.getVisibleBounds()[0]._x;
  yLT = maiaApp.getVisibleBounds()[0]._y;
  xRB = maiaApp.getVisibleBounds()[1]._x;
  yRB = maiaApp.getVisibleBounds()[1]._y;
  if (x < xLT || x > xRB){
    return false;
  }
  else if (y < yRB || y > yLT){
    return false;
  }
  else return true;
}

function getCorners(){
  xLT = maiaApp.getVisibleBounds()[0]._x;
  yLT = maiaApp.getVisibleBounds()[0]._y;
  xRB = maiaApp.getVisibleBounds()[1]._x;
  yRB = maiaApp.getVisibleBounds()[1]._y;
  alert("[ " + xLT + " ; " + xRB + " ]," +
    "\n[ " + yLT + " ; " + yRB + " ]");
}

function refresh(evt){
  clearPois();
  setBoundsFromCentre(evt);
  var bounds = {
    upperLeftCorner : evt.upperLeftCorner,
    lowerRightCorner : evt.lowerRightCorner
  };
  setCorners(bounds);
  updateCoordinates(partners_attribute_1, partners_attribute_2, partners_attribute_3, partners_attribute_4, upperLeftCornerX, upperLeftCornerY, lowerRightCornerX, lowerRightCornerY, partnerViewer, p_autoZoom);
}

function clearPois(){
  maiaApp.clearPOIs();
  if (poiList == null) return;
  for(var i = 0; i< poiList.length; i++) {
    flash.release(poiList[i]);
  }
}

function drawPoi(id, name, x, y){
  var poi = new POI(id, {
    label: name, 
    index: 1 ,
    x: x,
    y: y,
    cs: "wgs84",    
    icon: partner_locator_poi_icon,
    nomVille : name
  }, flash);
  maiaApp.addPOI(poi);
  poiList.push(poi);
}

function show_partner(x, y){
  var coords = new Coordinates(x, y);
  var coordsLoc = new CoordinatesLocation(coords, flash);
  geocoder.geocode(coordsLoc);
}

