
//trackId needed.

function getPolygons(){
   
        startTime = (new Date()).getTime();
        var bound = map.getBounds();
        var zLevel = getNormZoomLevel(map.getZoom());
        var coords = "zLevel=" + zLevel;
        
        coords = coords + "&minLng=" +bound.getSouthWest().lng(); 
        coords = coords + "&maxLng=" +bound.getNorthEast().lng();
        coords = coords + "&minLat=" +bound.getSouthWest().lat(); 
        coords = coords + "&maxLat=" +bound.getNorthEast().lat();
                
        var url = "sendXml.php?trackId=" + trackId + "&" + coords;        
        xmlRequest(url, function(request) {
                             if(request.readyState==4) {
                                   loadXml(request.responseXML,zLevel);
                             }
                        });
}

function insertPolygonsIntoChains(polys,zLevel,formerZoomLevel){

  var zoomIn = false;
  if(zLevel > formerZoomLevel){
    appendTxt("Zoom in adding some points ");
    zoomIn = true;
  }
  
  if(zLevel < formerZoomLevel){
    removePointAfterZoomOut(zLevel);
  }  
  
  var pointsAdded = 0;
  var allPoints = 0;
  poly_loop:
  for (var p = 0; p < polys.length ; p++) {
      var points = polys[p].getElementsByTagName("point");;
      allPoints += points.length;
      var polyMin = parseInt( points[0].getAttribute('id'));
      var polyMax = parseInt( points[points.length - 1].getAttribute('id'));
      var j = 0;
      var inChain = false;
      //check if we are not in an existing chain...
      for(;j<chains.length;j++){
          if(chains[j].firstPointId <= polyMin 
                  && polyMin <= chains[j].lastPointId + 1) { //note : possible that we miss a link here. But ok 'cause out of screen in this case
                  //MIN IN CHAIN !!!!
                  if(polyMax < chains[j].lastPointId && !zoomIn) {
                     //completely in current chain.
                     //skip this poly
                     for(var ppi=0;ppi<chains[j].elements.length;ppi++){
                        if(chains[j].elements[ppi].point != null && chains[j].elements[ppi].point.id >= polyMin 
                            && chains[j].elements[ppi].point.id <= polyMax) { 
                          chains[j].elements[ppi].age = 0;
                        }
                     }
                     continue poly_loop;
                  } else {
                      inChain = true;
                      break;
                  }
          } else if(polyMin < chains[j].firstPointId) {
              if( polyMax > chains[j].firstPointId ) {              
                  inChain = true;
              }
              break;
          }
      }
      var currentlyInChain = j;
      var chain;
      if(!inChain){
              chain = new Chain();
              chain.firstPointId = polyMin;
              chain.lastPointId = -1;
              chains.splice(currentlyInChain,0, chain);
              updatePointsChainId(0);
              appendTxt("Creating chain : " + currentlyInChain + " new length : " + chains.length);
      } else {
              chain = chains[currentlyInChain];
      }
      
      var poiEl = polys[p].getElementsByTagName("poi");;
      var pois = new Array();
      for (var pi = 0; pi < poiEl.length ; pi++) {
          var ptid = poiEl[pi].getAttribute("point_id");
          pois[ptid] = new Poi(poiEl[pi]);
      }

      pointsAdded += insertPointsIntoChain(points,currentlyInChain,pois);

      chain.setExtremePointsId();
  }
  appendTxt("Pts added : " + pointsAdded + "/" + allPoints);
}


//chains needed

function removePointAfterZoomOut(zLevel) {
    appendTxt("Zoom out : Removing some points ");
    var removed = 0;
        //on supprime les points 'inutiles' (zlevel superieurs non modifiés)
        var cleanUpStartTime = (new Date()).getTime();
        for(var j = 0;j<chains.length;j++){
                var chain = chains[j];
                var removing = false;
                for(var i = 0;i<chain.elements.length;i++){
                    if((!(insertionMode && j == currentChainId && i == currentPointIdInChain))
                                && (chain.elements[i].status == 0)
                                && chain.elements[i].point.level > zLevel){
                                
                        if(chain.elements[i].mark != null) {
                            GEvent.clearInstanceListeners(chain.elements[i].mark);                          
                            map.removeOverlay(chain.elements[i].mark);
                        }
                        if(chain.elements[i].lineToPrevious != null)
                                map.removeOverlay(chain.elements[i].lineToPrevious);                                
                        chain.elements.splice(i,1);
                        i--;
                        
                        if(i>1){
                            chain.elements[i-1].updateMarker();
                        }
                        removing = true;
                        removed++;
                    } else {
   		        chain.elements[i].updateMarker();
                        if(removing){
                            chain.elements[i].drawLineToPrevious();
                        }
                        removing = false;
                    }
                }
                if(chain.elements.length == 0) {
                        //Removing chain.
                        appendTxt("removing chain in zoom out");
                        chains.splice(j,1);
                        updatePointsChainId(j);                        
                        j--;
                } else {
                        //TODO check the handling of cases where there .point == null 
                        if(chain.elements[0].point != null){
                                chain.firstPointId = chain.elements[0].point.id;
                        } else {
                                chain.firstPointId = -1;                        
                        }

                        chain.setExtremePointsId();

                }
        }
    appendTxt("Zoom out, removed : " + removed);
  
}

function _void(){}

function cleanReload() {
    while(chains.length != 0 ){
             var chain = chains.pop();
             while(chain.elements.length != 0 ){
                 var el = chain.elements.pop();
                 if(el.mark != null) {
                     GEvent.clearInstanceListeners(el.mark);                          
                     map.removeOverlay(el.mark);
                 }
                 if(el.lineToPrevious != null){
                     map.removeOverlay(el.lineToPrevious);
                 }
             }
    }
    getPolygons();
    
}

function makeSpan(text){
    var sp = document.createElement("span");
    sp.innerHTML = text;
    return sp;
}

