var criters = null;
var myElementRoot = null;
var selection = '';
var precisions = null;
var filters = null;
var rootCenter = null;
var parentCenter = null;
var centers = null;
var page = 0;
var instruction = "<p class=\"aide\"><span class=\"aide_titre_orange\">Comment utiliser la g&eacute;olocalisation ?</span><br/><br/><span class=\"aide_titre\">1. S&eacute;lectionner une <b>r&eacute;gion</b></span><br/>&nbsp;&nbsp;&nbsp;&#149;&nbsp;en choissisant dans la liste<br/>&nbsp;&nbsp;&nbsp;&#149;&nbsp;en cliquant sur la carte<br/><br/><span class=\"aide_titre\">2. S&eacute;lectionner un <b>d&eacute;partement</b></span><br/>&nbsp;&nbsp;&nbsp;&#149;&nbsp;en choissisant dans la liste<br/>&nbsp;&nbsp;&nbsp;&#149;&nbsp;en cliquant sur la carte<br/><br/><span class=\"aide_titre\">3. Appliquer un <b>secteur</b> &agrave; tout moment</span></p>";


function loadCriter() {
  criters = new Array();
  filters = new Array();
  precisions = new Array();
  centers = new Array();
  myElementRoot = document.getElementById("criters");
  var listChilds;
  //alert("Debut chargement critere");
  if (myElementRoot.hasChildNodes()) {
    listChilds = myElementRoot.getElementsByTagName("select");
    for (var ic = 0; ic < listChilds.length; ic++) {		/// Dans cette boucle 0 => region, 1 => departement 2, => secteur
      var mychild = listChilds[ic];
	  if (mychild.id == 'departement')		/// Mad 20090319 regionalisation : selection du 1er elt par défaut désactivée pour région et secteur
      	mychild.selectedIndex = 0;		
      var myname = mychild.name;
      var myprecision = parseInt(mychild.options[0].value);
      if (ic != 0) {
        var exist = 0;
        for (var jc = 0; jc < criters.length && exist == 0; jc++) {
          if ( criters[jc][0] == myname) {
            exist = 1;
          }
        }
        if ( exist == 0 ) {
          criters.push(new Array(myname,myprecision));
          if ( ic == 0 || myprecision > precisions[0][2]) {
            precisions[0][2] = myprecision;
            precisions[0][3] = myname;
          }
          if ( ic == 0 || myprecision < precisions[0][0]) {
            precisions[0][0] = myprecision;
            precisions[0][1] = myname;
          }
        }
      } else {
        criters.push(new Array(myname,myprecision));
        precisions.push(new Array(myprecision,myname,myprecision,myname));
      }
    }
  }
  
  
  myElementRoot = document.getElementById("filters");
  if (myElementRoot.hasChildNodes()) {
    listChilds = myElementRoot.getElementsByTagName("select");
    for (var ic = 0; ic < listChilds.length; ic++) {
      var mychild = listChilds[ic];
      mychild.selectedIndex = 0;
      var myname = mychild.name;
      var myprecision = parseInt(mychild.options[0].value);
      if (ic != 0) {
        var exist = 0;
        for (var jc = 0; jc < filters.length && exist == 0; jc++) {
          if ( filters[jc][0] == myname) {
            exist = 1;
          }
        }
        if ( exist == 0 ) {
          filters.push(new Array(myname,mprecision));
          if ( ic == 0 || myprecision > precisions[1][2]) {
            precisions[1][2] = myprecision;
            precisions[1][3] = myname;
          }
          if ( ic == 0 || myprecision < precisions[1][0]) {
            precisions[1][0] = myprecision;
            precisions[1][1] = myname;
          }
        }
      } else {
        filters.push(new Array(myname,myprecision));
        precisions.push(new Array(myprecision,myname,myprecision,myname));
      }
    }
  }
  //alert(precisions);
  //alert("Fin chargement critere");
    divRegion =  myElementRoot.getElementsByTagName("select");
  selectChange('region','criter');		//// Mad on rempli le select du département pour la region sélectioné par défaut.
}

function selectChange(sname,stype) {
  var ssselect = null;
  ssselect = findName(document,"select",sname);
  if ( ssselect != null ) {
    var type = sname;
    if ( ssselect.selectedIndex != 0 ) {
      var name = ssselect.options[ssselect.selectedIndex].text;
      var id = ssselect.options[ssselect.selectedIndex].value;
      if ( stype.match("criter") ) {
        addCriter(name,type,id);
      }
      if ( stype.match("filter") ) {
        addFilter(name,type,id);
      }
    } else {
      if ( stype.match("criter") ) {
        removeCriter(type);
      }
      if ( stype.match("filter") ) {
        removeFilter(type);
      }
    }
  }
}

function addCriter(nom,type,id) {
  //alert("Fonction Ajout d'un critère");
  var tab_selec=selection.split('&');
  var exist = 0;
  var currentprecision = 0;
  //alert("nb criter: "+criters.length);
  for (var ic = 0; ic < criters.length && exist == 0; ic++) {
    //alert("Criter tableau: "+criters[ic][0]+", criter: "+type);
    if ( criters[ic][0] == type) {
      currentprecision = criters[ic][1];
      exist = 1;
      //alert("Criter valid: "+criters[ic][0]+", precision: "+criters[ic][1]);
    }
  }
  //alert("la precision courrente est: "+precisions[0][0]+", la precision demander est: "+currentprecision+", la precision maximal est: "+precisions[0][2]+", exist vaut: "+exist);
  //if ( currentprecision >= precisions[0][0] ) {
    precisions[0][0] = currentprecision+1;
    if (currentprecision == precisions[0][2])
      page = 0;
    //alert("precisions (critere): "+precisions[0][0]);
    precisions[0][1] = type;
  //}
  selection='';
  for (var jc = 0; jc < tab_selec.length; jc++) {
    if ( !tab_selec[jc].match('criter=') && !tab_selec[jc].match('criterid=')) {
      if ( selection.length != 0) {
        selection = selection+"&"+tab_selec[jc];
      } else {
        selection = tab_selec[jc];
      }
    }
  }
  //alert("selection avant: "+selection);
  if (exist == 1) {
    //alert("Ajout reel d'un critère: "+'criter='+type+'&criterid='+id);
    if ( selection.length != 0) {
      selection = selection+'&criter='+type+'&criterid='+id;
    } else {
      selection = 'criter='+type+'&criterid='+id;
    }
    var select = findName(document,"select",type);
    //alert("SelectedIndex: "+select.selectedIndex);
    //alert("Value: "+select.options[select.selectedIndex].value);
    var value = parseInt(select.options[select.selectedIndex].value);
    //alert ("Select: "+select.name+"\nValue: "+value+"\nid: "+id);
    //if ( value != id ) {
      var isfinish = 0;
      //alert("Debut boucle fort");
      for (var ic = 1; ic < select.options.length && isfinish == 0; ic++) {
        //alert("Value: "+select.options[ic].value+",id: "+id);
        if (ic > 0 && select.options[ic].value == id) {
          //alert("Trouver");
          isfinish = 1;
          select.selectedIndex = ic;
        }
      }
    //}
    var ssselect = null;
    //alert("selection: "+selection);
    for (var ic = 0; ic<criters.length; ic++) {
      if (criters[ic][1] >= precisions[0][0]) {
        ssselect = findName(document,"select",criters[ic][0]);
        //alert("Currentprecision: "+currentprecision+", precision criter"+criters[ic][1]);
        if (criters[ic][1] == precisions[0][0]) {
          //alert("Selection: "+selection);
          var data = ADownloadUrl('./include/GoogleMap/select_list.php?'+selection);
          //alert(data);
          if (!navigator.userAgent.match("MSIE")) {
            ssselect.innerHTML = data;
          } else {
            ssselect.outerHTML = '<select id="'+ssselect.id+'" name="'+ssselect.name+'" title="'+ssselect.title+'" onchange="selectChange(\''+ssselect.name+'\',\'criter\');">'+data+'</select>';
          }
          ssselect.disabled=false;
        } else {
          ssselect.disabled=true;
        }
      }
    }
    //alert("selection apres: "+selection+", parent center: "+parentCenter);
    generate_markers();
    return true;
  } else {
    return false;
  }
}

function addFilter(nom,type,id) {
  //alert("Fonction Ajout d'un filtre");
  var tab_selec=selection.split('&');
  var exist = 0;
  var currentprecision = 0;
  for (var ic = 0; ic < filters.length && exist == 0; ic++) {
    if ( filters[ic][0] == type) {
      currentprecision = filters[ic][1];
      exist = 1;
    }
  }
  if ( currentprecision > precisions[1][0] ) {
    precisions[1][0] = currentprecision+1;
    precisions[1][1] = type;
    //alert("precisions (filtre): "+precisions[1][0]);
    selection='';
    for ( var jc = 0; jc < tab_selec.length; jc++) {
      if ( !tab_selec[jc].match('filter=') && !tab_selec[jc].match('filterid=')) {
        if ( selection.length != 0) {
          selection = selection+"&"+tab_selec[jc];
        } else {
          selection = tab_selec[jc];
        }
      }
    }
  } else {
    if ( precisions[1][1] == type && selection.length != 0) {
      selection='';
      for (var jc = 0; jc < tab_selec.length; jc++) {
        if ( !tab_selec[jc].match('filter='+type) && !tab_selec[jc].match('filterid=')) {
        //if ( !tab_selec2[ic].match(text) ) {
          //alert(tab_selec[ic].match(text));
          if ( selection.length != 0) {
            selection = selection+"&"+tab_selec[jc];
          } else {
            selection = tab_selec[jc];
          }
        }
      }
    }
  }
  //alert("selection: "+selection);
  if (exist == 1) {
    //alert("Ajout reel d'un filtre: "+'filter='+type+'&filterid='+id);
    if ( selection.length != 0) {
      selection = selection+'&filter='+type+'&filterid='+id;
    } else {
      selection = 'filter='+type+'&filterid='+id;
    }
    //alert(selection);
    generate_markers();
    return true;
  } else {
    return false;
  }
}

function removeCriter(type) {
  var tab_selec=selection.split('&');
  selection='';
  for (var ic = 0; ic < tab_selec.length; ic++) {
    if ( !tab_selec[ic].match('criter=') && !tab_selec[ic].match('criterid=')) {
      //alert(tab_selec[ic].match(text));
      if ( selection.length != 0) {
        selection = selection+"&"+tab_selec[ic];
      } else {
        selection = tab_selec[ic];
      }
    }
  }
  //if ( selection.length != 0 ) {
    //alert("Selecion non vide: recherche du criter moins precis à ajouter");
    var newprecision = 0;
    var newcriter = type;
    var isfind = 0;
    var currentprecision = 0;
    do {
      var isfind2 = 0;
      for (var ic = 0; ic < criters.length && isfind2 == 0; ic++) {
        if (criters[ic][0] == newcriter ) {
          newprecision = criters[ic][1]-1;
          currentprecision =  criters[ic][1];
          isfind2 = 1;
        }
      }
      if ( newprecision < 0 ) {
        newprecision = 0;
      }
      var isfind2 = 0;
      for (var ic = 0;ic <criters.length && isfind2 == 0; ic++) {
        if ( criters[ic][1] == newprecision ) {
          newcriter = criters[ic][0];
          isfind2 = 1;
        }
      }
      var select = findName(document,"select",newcriter);
      var id = parseInt(select.options[select.selectedIndex].value);
      var text = select.options[select.selectedIndex].text;
      if ( select.selectedIndex != 0 ) {
        addCriter(text,newcriter,id);
        isfind = 1;
        precisions[0][0] = newprecision+1;
      } else {
        precisions[0][0] = newprecision;
      }
      precisions[0][1] = newcriter;
    } while (isfind == 0 && newprecision != 0 );
    var ssselect = null;
    for (var ic = 0; ic<criters.length; ic++) {
      ssselect = findName(document,"select",criters[ic][0]);
      if ( criters[ic][1] > precisions[0][0] ) {
        ssselect.selectedIndex = 0;
        ssselect.disabled=true;
      }
      if (criters[ic][1] == precisions[0][0]) {
        ssselect.disabled=false;
      }
    }
  //} else {
  //  precisions[0][0] = 0;
  //}
  generate_markers();
  return true;
}

function removeFilter(type) {
  var tab_selec=selection.split('&');
  selection='';
  for (var ic = 0; ic < tab_selec.length; ic++) {
    if ( !tab_selec[ic].match('filter') && !tab_selec[ic].match('filterid')) {
      //alert(tab_selec[ic].match(text));
      if ( selection.length != 0) {
        selection = selection+"&"+tab_selec[ic];
      } else {
        selection = tab_selec[ic];
      }
    }
  }
  generate_markers();
  return true;
}

function generate_label() {
  var noderesult = document.getElementById("results");
  noderesult.innerHTML = "Chargement ..."
  //alert("selection: "+selection);
  //alert("Calcul du zoom");
  var tab_selec= selection.split('&');
  var displaysoc = 0;
  var currentprecision = 0;
  var end = 0;
  for (var ic = 0; ic < criters.length && selection != 0 && end == 0; ic++) {
    for (var jc = 0; jc < tab_selec.length && end == 0 ; jc++) {
     //alert("tab selec: "+tab_selec[jc]+", criters: "+criters[ic][0]);
      if ( tab_selec[jc].match(criters[ic][0])) {
        currentprecision = criters[ic][1];
        end = 1;
        //alert("current: "+currentprecision);
      }
    }
  }
  //alert("precision demande: "+currentprecision+", precision maximal: "+precisions[0][2]);
  if ( selection.length != 0 && currentprecision == precisions[0][2]) {
    displaysoc = 1;
  }
  //alert("displaysoc : "+displaysoc);
  if ( displaysoc == 1 ) {
    //alert("Marker Societe");
    generate_soc();
  } else {
    //alert("Marker Label");
    var noeud = document.getElementById("liste_societe");
    var url = "./include/GoogleMap/selection_pays.php";
    if ( selection.length != 0 ) {
      url += '?'+selection+'&criterzoom='+precisions[0][0];
      var withfilter = 0
      for (var ic =0; ic < tab_selec.length && withfilter == 0; ic++) {
        if ( tab_selec[ic].match("filter") ) {
          withfilter = 1;
          url += '&filterzoom='+precisions[1][0];
        }
      }
    }
    //alert("url: "+url);
    noeud.innerHTML = instruction;
    //alert("precision: "+precisions[0][0]);
    if ( precisions[0][0] == 0 ) {
      map.setZoom(5);
    } else {
      map.setZoom(9);
    }
    GDownloadUrl(url,function(data) {
        parseLabel(data);
        //alert("parent Center: "+parentCenter);
        map.setCenter(parentCenter, 6);
    });

  }
}

function generate_soc() {
  //alert("selection: "+selection);
  tab_selec = selection.split('&');
  urll = './include/GoogleMap/liste_societe.php';
  url = './include/GoogleMap/selection_societe.php';
  if ( selection.length != 0 ) {
    urll += '?'+selection+'&page='+page;
    url += '?'+selection+'&page='+page;
    var withfilter = 0;
    for (var ic =0; ic < tab_selec.length && withfilter == 0; ic++) {
      if ( tab_selec[ic].match("filter") ) {
        withfilter = 1;
        url += '&filterzoom='+precisions[1][0];
      }
    }
    var data = ADownloadUrl(urll);
    //GDownloadUrl(urll, function(data) {
      var noeud = document.getElementById("liste_societe");
      noeud.innerHTML = data;

      //alert("url: "+url);
      //GDownloadUrl(url,function(data) {
      //  parseSoc(data);
      //});
      var data2 = ADownloadUrl(url);
      parseSoc(data2);
    //});
  }
}

function createMarkerLabel(point,nb,text,id) {
  //alert(nb+": "+text+" : "+id);
  var x = -12-(3*(nb.length-1));
  //alert(x);
  var opts = { "icon": getIcon(0),
            "clickable": false,
            "labelText": nb,
            "labelOffset": new GSize(x,-16),
            "labelClass": 'dep_marker'
            };
  var marker = new LabeledMarker(point,opts);
  GEvent.addListener(marker, "click", function() {
      //alert("id: "+id+"text: "+text);
      parentCenter = point;
      var type = '';
      var isfinish = 0;
      var newprecision = 0;
      for (var ic = 0; ic < criters.length && isfinish == 0; ic++) {
        if (selection != 0) {
          newprecision = precisions[0][0];
          //alert("precision recherchée: "+newprecision+", criters[ic][1]: "+criters[ic][1]);
          if ( criters[ic][1] == newprecision ) {
            type = criters[ic][0];
            isfinish = 1;
          }
        } else {
          if (criters[ic][1] == 0 ){
            type = criters[ic][0];
            isfinish = 1;
          }
        }
      }
      addCriter(text,type,id);
  });
  return marker;
}

function findId(element,name,id) {
  var nodelist = element.getElementsByTagName(name);
  var find = 0;
  var node = null;
  for (var ic = 0; ic < nodelist.length && find == 0; ic++) {
    node = nodelist[ic];
    if( node.getAttribute("id") == id) {
      find = 1;
    }
  }
  if (find == 0) {
    return null;
  } else {
    return node;
  }
}

function findName(element,tag,name) {
  var nodelist = element.getElementsByTagName(tag);
  var find = 0;
  var node = null;
  for (var ic = 0; ic < nodelist.length && find == 0; ic++) {
    node= nodelist[ic];
    if ( node.getAttribute("name") == name ) {
      find = 1;
    }
  }
  if ( find == 0) {
    return null;
  } else {
    return node;
  }
}

function parseLabel(data) {
  //alert("Parseur XML Pays");
  var xml = GXml.parse(data);
  var tab_selec = selection.split('&');
  var balise ="criter";
  var withfilter = 0;
  if ( selection.length == 0 ) {
      parentCenter = rootCenter;
  } else {
    var data = ADownloadUrl("./include/GoogleMap/selection_pays.php?"+selection);
    //alert("include/GoogleMap/selection_pays.php?"+selection);
    var xml = GXml.parse(data);
    var node = xml.documentElement.getElementsByTagName("criter");
    if (node[0] == null) {
      node = xml.documentElement.getElementsByTagName("filter");
    }
    if (node[0] != null) {
      var lat = parseFloat(node[0].getAttribute("lat"));
      var lng = parseFloat(node[0].getAttribute("lng"));
      parentCenter = new GLatLng(lat,lng);
    } else {
      parentCenter = rootCenter;
      map.setZoom(8);
    }
  }
  for (var ic =0; ic < tab_selec.length && withfilter == 0; ic++) {
    if ( tab_selec[ic].match("filter") ) {
      withfilter = 1;
      balise="filter"
    }
  }
  var nodes = xml.documentElement.getElementsByTagName(balise);
  var donnes = new Array();
  var j = 0;
  var nbresults = 0;
  for (var ic = 0; ic < nodes.length; ic++) {
    if ( nodes[ic].getAttribute("nb") != "0" ) {
      var lat = parseFloat(nodes[ic].getAttribute("lat"));
      var lng = parseFloat(nodes[ic].getAttribute("lng"));
      var point = new GLatLng(lat,lng);
      var nb = nodes[ic].getAttribute("nb");
      //alert("Nodes["+ic+"][id] : "+nodes[ic].getAttribute("id"));
      //alert("Nodes["+ic+"][parentid] : "+nodes[ic].getAttribute("parentid"));
      nbresults += parseInt(nb);
      donnes.push(new Array(point,nb));
      var text;
      var id;
      var marker;
      if ( nodes[ic].getAttribute("type") == precisions[0][3]) {
        text = nodes[ic].getAttribute("name");
        id = nodes[ic].getAttribute("id");
        marker = createMarkerLabel(point,nb,text,id);
        markers.push(marker);
        map.addOverlay(marker);
      } else {
        url = "./include/GoogleMap/selection_pays.php?";
        if (  selection.length != 0 ) {
          url +=selection;
        } else {
          url +='lat='+lat+'&lng='+lng
        }
        url +='&criterzoom='+precisions[0][0];
        var data = '';
        var noderesult = document.getElementById("results");
        try {
          data = ADownloadUrl(url);
        } catch (ex) {
          noderesult.innerHTML = "Prob&egrave;me de connexion :<br/>reactualiser la page."
        }
        //alert("url: "+url);
        if ( data != '' ) {
          var xml2 = GXml.parse(data);
          var deps = xml2.documentElement.getElementsByTagName(balise);
          text = deps[0].getAttribute("name");
          if ( balise == "filter") {
            //alert("Parentid avant : "+id+", donne: "+deps[0].getAttribute("parentid"));
            //id = deps[0].getAttribute("parentid");
            id = nodes[ic].getAttribute("parentid");
            //alert("Parentid apres : "+id+", donne: "+deps[0].getAttribute("parentid"));
          } else {
            //alert("id avant : "+id+", donne: "+deps[0].getAttribute("id"));
            id = deps[0].getAttribute("id");
            //alert("id apres : "+id+", donne: "+deps[0].getAttribute("id"));
          }
          //alert(text+" : "+id);
          marker = createMarkerLabel(donnes[j][0],donnes[j][1],text,id);
          markers.push(marker);
          map.addOverlay(marker);
          j++;
        } else {
          //alert("Pas de données !");
        }
      }
    }
  }
  var txtresults = '';
  if ( nbresults > 1 ) {
    txtresults = nbresults+" soci&eacute;t&eacute;s g&eacute;olocalis&eacute;es";
  } else {
    txtresults = nbresults+" soci&eacute;t&eacute; g&eacute;olocalis&eacute;e";
  }
  var noderesult = document.getElementById("results");
  noderesult.innerHTML = txtresults;
  //alert("Fin parseur XML Pays");
}

function parseSoc(data) {
  var xml = GXml.parse(data);
  //alert("Fichier XML chargé");
  var soc = xml.documentElement.getElementsByTagName("societe");
  var annu = xml.documentElement.getElementsByTagName("nb");
  var agent = navigator.userAgent.toLowerCase();
  var ie = false;
  if ((agent.indexOf("msie") > -1) && (agent.indexOf("opera") < 1)){ie = true} else {ie = false}
  var nb = annu[0];
  if (ie)
    nb = nb.text;
  else
    nb = nb.textContent;
  //alert("soc: "+soc);
  for (var ic = 0; ic < soc.length; ic++) {
    var lat = parseFloat(soc[ic].getAttribute("lat"));
    var lng = parseFloat(soc[ic].getAttribute("lng"));
    var point = new GLatLng(lat,lng);
    var id = soc[ic].getAttribute("id");
    var paye = parseInt(soc[ic].getAttribute("paye"));
    var marker = createMarker(point,id,paye);
    markers.push(marker);
    map.addOverlay(marker);
  }
  activateRollOverMarker();
  activateRollOverMenu();
  //alert("Fin d'ajout des marqueurs");
  var txtresults = '';
  if ( soc.length > 1 ) {
    txtresults = nb+" soci&eacute;t&eacute;s g&eacute;olocalis&eacute;es";
  } else {
    txtresults = nb+" soci&eacute;t&eacute; g&eacute;olocalis&eacute;e";
  }
  var noderesult = document.getElementById("results");
  noderesult.innerHTML = txtresults;
}


function nextPage() {
  //alert("Page avant: "+page);
  page += 1;
  generate_markers();
  //alert("Page apres: "+page);
}

function prevPage() {
  //alert("page avant: "+page);
  if (page > 0) {
    page -= 1;
    generate_markers();
  }
  //alert("Page apres: "+page);
}