/***
INIT VARS 
***/
var map = null;
var geocoder = null;
var allmarkers = [];
var officeLayer = [{"zoom": [0, 17],"places": []}];

/***
INIT OBJECTS 
***/
//Common object function to generate json type array {} 
function __Serialize(thisObject){
    aSerialize=new Array();
    for(key in thisObject) {
      //ignore nulls ...
      if(!thisObject[key])  continue;
      //ignore methods ...
      if(Function.prototype.isPrototypeOf(thisObject[key]))  continue;
      //Dates to seconds ... 
      var sValue="";
      if(String.prototype.isPrototypeOf(thisObject[key])) {
        sValue=thisObject[key].replace(/\r?\n/,"\\r\\n").replace(/\"/,'\\"');
      } else if (Date.prototype.isPrototypeOf(thisObject[key])) {
        sValue=thisObject[key].getTime()/1000;
      } else if(Array.prototype.isPrototypeOf(thisObject[key])) {
        sValue="'"+thisObject[key].join("','")+"'";
      } else {
        sValue=thisObject[key];
      }
      var sSep=!sValue || isNaN(sValue)?'"':'';
      aSerialize.push(key+": "+sSep+sValue+sSep);
    }
    // add extra () to avoid invalid label error
    return eval("({"+aSerialize.join(", ")+"})");
  }

var aLieux=new Array();
function Lieu(iId) {
  this.iId=iId;
  this.sNom="";
  this.sAdresse="";
  this.sCP="";
  this.sPoint="";
  this.sVille ="";
  this.getAddress=function() {
    return this.sAdresse+" "+this.sCP+" "+this.sVille;
  }
}

Lieu.prototype.serialize=function() {return __Serialize(this);};


var aThemes=new Array(); 
function Theme(iId) { 
   this.iId=iId;
   this.sNom=''; 
}
Theme.prototype.serialize=function() {return __Serialize(this);}; 


/***
  LAYER OBJECT
***/
function Layer() {
  this.zoom=[6,17];
  this.places=[];
}

/***
FUNCTIONS 
  - initialize  map
  - define icon markers
  - setupOfficeMarker manage layers 
***/
function initialize() {

 if (GBrowserIsCompatible()) {

    map = new GMap2(document.getElementById("googleMap"));
    map.addControl(new GLargeMapControl());
    map.enableDoubleClickZoom();
    map.setCenter(new GLatLng(43.604363,1.4429513), 12);
    GEvent.addListener(map, "click", function(overlay,latlng) {
      if(overlay) return;
      var iZoom=parseInt(map.getZoom())>5?parseInt(map.getZoom())+1:6;
      map.setCenter(latlng, iZoom);
    });
    mgr = new MarkerManager(map, {trackMarkers:true});
    geocoder = new GClientGeocoder();
  }

}

function iconLieu() {
  if(aLieux.length == 1){
     oIconLieu = new GIcon();
     oIconLieu.image = "images/btn_petit_carte1.gif";
     oIconLieu.iconSize = new GSize(33, 61);
     oIconLieu.iconAnchor = new GPoint(33, 61);
     oIconLieu.shadow = "images/btn_petit_carte_ombre.png";
     oIconLieu.shadowSize = new GSize(33, 61);

  } else {
     oIconLieu = new GIcon();
     oIconLieu.image = "images/btn_petit_carte.png";
     oIconLieu.iconSize = new GSize(17, 31);
     oIconLieu.iconAnchor = new GPoint(17, 31);
     oIconLieu.shadow = "images/btn_petit_carte_ombre.png";
     oIconLieu.shadowSize = new GSize(17, 31);
  }
  return oIconLieu;
}

function setupOfficeMarkers() {

  allmarkers.length = 0;

  for (i=0; i<officeLayer.length; i++) {
    var layer = officeLayer[i];
    var markers = [];
    var j = 0;
    for (j=0; j<layer["places"].length; j++) {
      var oMarker= layer["places"][j];
      markers.push(oMarker);
      allmarkers.push(oMarker);
    }
    mgr.addMarkers(markers, layer["zoom"][0], layer["zoom"][1]);
  }
  mgr.refresh();
}

function showLieu(oLieu, i) {
  var aCoordinates=oLieu.sPoint.substr(0).split(/[\(\)\,]/);
  var oPoint = new GLatLng(aCoordinates[0],aCoordinates[1]);

  var oMarker = new GMarker(oPoint, {title:oLieu.sNom , icon:iconLieu()});
  oMarker.iLieu=oLieu.iId;
//oLieu.sNom
  GEvent.addListener(oMarker, "click", function() {
        var oLieu=aLieux[i];
        var sHTML = oLieu.sNom+"<br /> "+oLieu.getAddress();
        map.openInfoWindowHtml(oPoint, sHTML);
   });
   if(aLieux.length == 1){
        var oLieu=aLieux[i];
        var sHTML = oLieu.sNom+"<br /> "+oLieu.getAddress();
        map.openInfoWindowHtml(oPoint, sHTML);
   }
   officeLayer[0]["places"].push(oMarker);
}



/*** 
 THEMES 
***/ 
function shoTheme(oTheme) { 
    var iLayer=parseInt(oTheme.value); 
    if (oTheme.checked) { 
        var oLayer = officeLayer[0]; 
        var cMarkers = []; 
         for (var j=0; j<oLayer["places"].length;j++) { 
            if(eval(oLayer["places"][j].iLieu) == iLayer){
               var oMarker= oLayer["places"][j]; 
               cMarkers.push(oMarker); 
               allmarkers.push(oMarker);  
             }
         } 
         mgr.addMarkers(cMarkers, oLayer["zoom"][0], oLayer["zoom"][1]); 
         mgr.refresh(); 
   } else { 
     var cPlaces=officeLayer[0]["places"]; 
     for(var p=0;p<cPlaces.length;p++) {
        if(eval(cPlaces[p].iLieu) == iLayer){
           mgr.removeMarker(cPlaces[p]); 
        }
      }
   } 
} 


function allThemes(oTheme) { 
   if (oTheme.checked) { 
     $("form.themes fieldset:not(.setD) input").attr('checked','checked'); 
     var oLayer = officeLayer[0]; 
     var cMarkers = []; 
     for (var j=0; j<oLayer["places"].length;j++) { 
          var oMarker= oLayer["places"][j]; 
          cMarkers.push(oMarker); 
          allmarkers.push(oMarker); 
     } 
     mgr.addMarkers(cMarkers, oLayer["zoom"][0], oLayer["zoom"][1]); 
     mgr.refresh(); 
   } else { 
     $("form.themes fieldset:not(.setD) input").removeAttr('checked'); 

     var cPlaces=officeLayer[0]["places"]; 
     for(var p=0;p<cPlaces.length;p++) 
         mgr.removeMarker(cPlaces[p]); 
  } 
} 

function getThemes(data) {

  try {
    eval(data);
    
    //add a office layer for each theme 
    var sFieldAHTML="<fieldset class='colA'>"; 
    var sFieldBHTML="<fieldset class='colB'>"; 
    var sFieldCHTML="<fieldset class='colC'>"; 

    for(var i=0;i<aThemes.length;i++) {
      officeLayer.push({"zoom": [6,17],"places": []}); 
      if(i%3==1) { 
         sFieldAHTML+="<div class='entry'><label><input type='checkbox' name='lieu_"+i+"' value='"+aThemes[i].iId+"' checked='checked' onclick='shoTheme(this);' />"+aThemes[i].sNom+"</label></div>"; 
      } else if(i%3==2) { 
         sFieldBHTML+="<div class='entry'><label><input type='checkbox' name='lieu_"+i+"' value='"+aThemes[i].iId+"' checked='checked' onclick='shoTheme(this);' />"+aThemes[i].sNom+"</label></div>"; 
      } else  { 
         sFieldCHTML+="<div class='entry'><label><input type='checkbox' name='lieu_"+i+"' value='"+aThemes[i].iId+"' checked='checked' onclick='shoTheme(this);' />"+aThemes[i].sNom+"</label></div>"; 
      } 
    } 
    sFieldAHTML+="</fieldset>"; 
    sFieldBHTML+="</fieldset>"; 
    sFieldCHTML+="</fieldset>";
    
    var sFieldDHTML="<fieldset class='setD'><div class='entry'><label><input type='checkbox' name='projects' value='on' checked='checked' onclick='allThemes(this);' />Selectionner tous ou deselectionner tous les lieux</label></div></fieldset>" 
    $("#themeBox").append("<form class=themes>"+sFieldDHTML+sFieldAHTML+sFieldBHTML+sFieldCHTML+"</form>"); 

    var param = '';
    var url = window.location.href;
    startIndex=url.indexOf("?"); 
    param=url.substr(startIndex+1); 
    if(param !='') param = "?"+param;
    $.get("getLieux.js"+param,function(data) { getLieux(data); });

  } catch(e) {
    //alert(e.message+"\n"+);
  }
}

function getLieux(data) {
  try {
    eval(data);
    
      for(var a=0;a<aLieux.length;a++) {
      var oLieu=aLieux[a];
      if(oLieu.sPoint!="") {
        showLieu(oLieu, a);
     } 
    }
  } catch(e) {
    //alert(e.message+"\n"+);
  }
  window.setTimeout(setupOfficeMarkers, 0);
}


/***
LOAD MARKERS 
***/
$(document).ready(function() {
  initialize();
  if (geocoder) {

      var param = '';
      var url = window.location.href;
      startIndex=url.indexOf("?"); 
      param=url.substr(startIndex+1); 

      if(startIndex != '-1') {
         param = "?"+param;
         $.get("getLieux.js"+param,function(data) { getLieux(data); });
      } else {
         $.get("getThemes.js",function(data) { getThemes(data); });
      }
  } 
}); 
