var searchPOIs;
var currentShownPOIs = new Array();
var initialNearestPOIs = new Array();
var newShownPOIs = new Array();
var isDetail = false;
var initialBoundsSet = false;
var currentDetailedPOI = '';
var poiImage = '';
var poiImageBig = '';
var imageXSmallOffset = 0;
var imageYSmallOffset = 0;
var imageXBigOffset = 0;
var imageYBigOffset = 0;
var centerImage = '';
var highlightedFOI;


//retourne les POIS initiaux d'une recherche séquencé avec l'initialisation de la map
function getPOIsOnServer() {
    centerImage = '<img title="'+ searchValue + '" src=\'images/star.gif\'/>';
    var url = '';
    if(searchType == 1) {
        url = baseHREF+"/showPois.do?searchType="+searchType+"&postalCode="+escape(searchValue)+"&lang="+lang+"&banner=" + banner + "&refresh="+new Date().getTime();
    } else {
        url = baseHREF+"/showPois.do?searchType="+searchType+"&province="+province+"&city="+escape(searchValue)+"&lang="+lang+"&banner=" + banner + "&refresh="+new Date().getTime();
    }
    var x = createXmlHttpRequest();
    x.open("POST",url,true);
    var temp = this;
    x.onreadystatechange = function(){
        if(x.readyState == 4) {
            mapview.setEventListener('zoom_level_change', wheelMouseEvent);
            searchPOIs = eval("(" + x.responseText + ")").pois;
            getPOIsAtProximity(centerX, centerY);
            extractCenterAndZoomLevel();
            mapview.display();
            moveZoom(mapview.getZoomLevel());
            if(searchPOIs.length == 1) {
                goDetails(searchPOIs[0].ID);
            } else {
                goResults();
            }
            mapview.setEventListener('recenter', onRecenter);
            mapview.setMouseWheelZoomEnabled(true);
        }
    }
    x.send(null);
}

//retourne les 10 POIS classés à proximité du centre de la recherche
function getPOIsAtProximity(tempCenterX, tempCenterY) {
    
    newShownPOIs = new Array();
    
    //classer les points en ordre de distance du centre de la recherche
    for(i = 0; i < searchPOIs.length; i++) {
        pointX = searchPOIs[i].X;
        pointY = searchPOIs[i].Y;
        pointID = searchPOIs[i].ID;
        distance = new Number(searchPOIs[i].DISTANCE);//Math.sqrt((Math.pow(Math.abs(tempCenterX - pointX), 2) + Math.pow(Math.abs(tempCenterY - pointY), 2)));        
        for(j = 0; j < 10; j++) {
            if(j == newShownPOIs.length) {//ajout d'un nouveau point
                newShownPOIs[j] = new Array();
                newShownPOIs[j][0] = searchPOIs[i];
                newShownPOIs[j][1] = distance;
                break;
            } else {
                if(distance < newShownPOIs[j][1]) {//insertion du point dans le array
                    newShownPOIs.splice(j, 0, new Array(searchPOIs[i], distance));
                    break;
                }
            }
        }
    }
    
    //ne sortir que les 10 premiers résultats et conserver les 10 valeurs initiales
    currentShownPOIs = new Array();
    initialNearestPOIs = new Array();
    for(i = 0; i < 10; i++) {
        if(!newShownPOIs[i]) {
            break;
        }
        initialNearestPOIs[initialNearestPOIs.length] = newShownPOIs[i][0];
        currentShownPOIs[currentShownPOIs.length] = newShownPOIs[i][0];
    }
}

//retourne de 0 à 10 pois à proximité du centre de la carte
function updatePOIs(isZoomToThematic) {
    
    if(!isDetail && searchPOIs) {
        
        xmin = mapview.getMapWindowBBox().getMBR()[0];
        ymin = mapview.getMapWindowBBox().getMBR()[1];
        xmax = mapview.getMapWindowBBox().getMBR()[2];
        ymax = mapview.getMapWindowBBox().getMBR()[3];
        
        tempCenterX = xmin + (xmax - xmin) / 2;
        tempCenterY = ymin + (ymax - ymin) / 2;
        
        newShownPOIs = new Array();    
        
        //classer les points en ordre de distance du centre de la carte
        for(i = 0; i < searchPOIs.length; i++) {
            pointX = searchPOIs[i].X;
            pointY = searchPOIs[i].Y;
            pointID = searchPOIs[i].ID;
            distance = Math.sqrt((Math.pow(Math.abs(tempCenterX - pointX), 2) + Math.pow(Math.abs(tempCenterY - pointY), 2)));        
            for(j = 0; j < 10; j++) {
                if(j == newShownPOIs.length) {//ajout d'un nouveau point
                    newShownPOIs[j] = new Array();
                    newShownPOIs[j][0] = searchPOIs[i];
                    newShownPOIs[j][1] = distance;
                    break;
                } else {
                    if(distance < newShownPOIs[j][1]) {//insertion du point dans le array
                        newShownPOIs.splice(j, 0, new Array(searchPOIs[i], distance));
                        break;
                    }
                }
            }
        }
      
        //ne sortir que les 10 premiers résultats
        currentShownPOIs = new Array();
        for(i = 0; i < 10; i++) {
            if(!newShownPOIs[i]) {
                break;
            }
            if(newShownPOIs[i][0].X < xmax && newShownPOIs[i][0].X > xmin && newShownPOIs[i][0].Y < ymax && newShownPOIs[i][0].Y > ymin) {
                currentShownPOIs[currentShownPOIs.length] = newShownPOIs[i][0];
            }
        }
        
        //classer les points en ordre de distance du centre de la recherche
        tempArray = new Array();
        for(i = 0; i < currentShownPOIs.length; i++) {
            distance = new Number(currentShownPOIs[i].DISTANCE);  
            for(j = 0; j < 10; j++) {
                if(j == tempArray.length) {//ajout d'un nouveau point
                    tempArray[j] = new Array();
                    tempArray[j][0] = currentShownPOIs[i];
                    tempArray[j][1] = distance;
                    break;
                } else {
                    if(tempArray[j][1] > distance) {//insertion du point dans le array
                        tempArray.splice(j, 0, new Array(currentShownPOIs[i], distance));
                        break;
                    }
                }
            }
        }

        //insérer les points de la recherche initiale qui sont plus près du centre de recherche tout en étant à l'intérieur des bounds
        if (tempArray.length > 0) {
            for(i = initialNearestPOIs.length-1; i >= 0; i--) {
                distance = new Number(initialNearestPOIs[i].DISTANCE);
                if(distance < tempArray[0][1] && initialNearestPOIs[i].X > xmin && initialNearestPOIs[i].X < xmax && initialNearestPOIs[i].Y > ymin && initialNearestPOIs[i].Y < ymax) {
                    tempArray.splice(0, 0, new Array(initialNearestPOIs[i], distance));
                }
            }
        }

        //ne garder que les dix premiers résultats
        var loopSize;
        if (tempArray.length > 10) {
            loopSize = 10;
        } else {
            loopSize = tempArray.length; 
        }

        currentShownPOIs = new Array();
        for(i = 0; i < loopSize; i++) {
            currentShownPOIs[i] = tempArray[i][0];
        }
        
        //générer le code HTML de la liste des résultats
        var resultsCode  = extractPOIs(currentShownPOIs);
        document.getElementById("resultCell").innerHTML = resultsCode;       
        
        //si aucun résultat, afficher un message
        if(currentShownPOIs.length > 0) {
            document.getElementById('noResults').style.display = 'none';
        } else {
            document.getElementById('noResults').style.display = 'block';
        }
        
        //zoomer sur la thématique si requis
        if(isZoomToThematic) {
            zoomToThematic();
        }
        
        //ajouter les foi de la liste currentShownPOI
        mapview.removeAllFOIs();
        if(searchType == 1) {
            addMapCenter(centerX, centerY, centerImage);
        }
        for(var i=0;i<currentShownPOIs.length;i++){
            var foi = MVFOI.createHTMLFOI(''+currentShownPOIs[i].ID, MVSdoGeometry.createPoint(currentShownPOIs[i].X, currentShownPOIs[i].Y, srid), getImage(currentShownPOIs[i].ID, currentShownPOIs[i].NAME), imageXSmallOffset,imageYSmallOffset)
            foi.setBringToTopOnMouseOver(false);
            mapview.addFOI(foi);
        }
    }
}

function getImage(id, name) {
    return '<img src=\'' + poiImage + '\' style=\'cursor: pointer\' title="'+ name + '" onmouseout=\'deHighlightLink('+ id +')\' onmouseover=\'highlightLink('+ id +')\' onclick=\'goDetails(' + id + ')\'/>'
}

function highlightLink(id) {
    document.getElementById('link' + id).style.textDecoration = 'underline';
    document.getElementById('link' + id).scrollIntoView(false);
}

function deHighlightLink(id) {
    document.getElementById('link' + id).style.textDecoration = 'none';
}

function showInfo(id, long, lat){    
    mapview.addFOI(MVFOI.createHTMLFOI(id + 't', MVSdoGeometry.createPoint(long, lat, srid), '<img src=\'' + poiImageBig + '\' />', imageXBigOffset, imageYBigOffset));
}
function hideInfo(id, long, lat){
    mapview.removeFOI(id + 't');
}


function goDetails(index){
    if(index != null && index != '') {
        isDetail = true;
        var url = baseHREF+"/details.do?id="+index +"&refresh="+new Date().getTime();
        var x = createXmlHttpRequest();
        x.open("POST",url,true);
        var temp = this;
        var poi;
        x.onreadystatechange = function(){ 
            if(x.readyState == 4) {
                poi = eval("(" + x.responseText + ")").poi;
                var resultsCode  = extractPOI(poi[0]);
                document.getElementById('detailTabOff').style.cursor = 'pointer';
                document.getElementById('detailTabOff').onclick = showDetailFOI;
                document.getElementById('detailResultsTitle').className = 'resultsTitle';
                document.getElementById("detailCell").innerHTML = resultsCode;            
                currentHTMLFOI = '' + poi[0].X + poi[0].Y;
                currentDetailedPOI = poi[0];
                showDetailFOI();
                extractCenterAndZoomLevel();                
            }
        }
        x.send(null);
    } else {
        
    }
    
}
function showDetailFOI() {
    isDetail = true;    
    mapview.removeAllFOIs();
    if(currentDetailedPOI.BANNER == 3) {
        mapview.addFOI(MVFOI.createHTMLFOI('' + currentDetailedPOI.X + currentDetailedPOI.Y, MVSdoGeometry.createPoint(currentDetailedPOI.X,currentDetailedPOI.Y , srid), '<img src=\'images/ICON_Napa_Big.gif\' />', imageXBigOffset, imageYBigOffset));
    } else if (currentDetailedPOI.BANNER == 4) {
        mapview.addFOI(MVFOI.createHTMLFOI('' + currentDetailedPOI.X + currentDetailedPOI.Y, MVSdoGeometry.createPoint(currentDetailedPOI.X,currentDetailedPOI.Y , srid), '<img src=\'images/ICON_CMAX_Big.gif\' />', imageXBigOffset, imageYBigOffset));
    } else {
        mapview.addFOI(MVFOI.createHTMLFOI('' + currentDetailedPOI.X + currentDetailedPOI.Y, MVSdoGeometry.createPoint(currentDetailedPOI.X,currentDetailedPOI.Y, srid), '<img src=\'images/ICON_Napa_Big.gif\' />', imageXBigOffset, imageYBigOffset));
    }
    extractCenterAndZoomLevel();
    showDetailDiv();
}
function goResults(){
    isDetail = false;
    extractCenterAndZoomLevel();
    updatePOIs(false);
    showResultsDiv();
}
function goSearch(){
    isDetail = false;
    showSearchDiv();
}

function extractPOIs(pois) {
    var resultsCode = "";
    var blue = true;
    resultsCode = resultsCode.concat("<table width=\"100%\" cellpadding='0' cellspacing='0' border='0'>");
    for(var i=0;i<pois.length;i++){
        if(blue) {
            trCode = "<tr style='background-color: #f0f5f9;'>";
            
        } else {
            trCode = "<tr>";
        }
        if(searchType == 1) {
            resultsCode = resultsCode.concat(trCode);
            resultsCode = resultsCode.concat("<td>");
            resultsCode = resultsCode.concat("<a id='link"+pois[i].ID+"' class='resultsName' onmouseover='showInfo("+i+","+pois[i].X+","+pois[i].Y+")' onmouseout='hideInfo("+i+","+pois[i].X+","+pois[i].Y+")' href='#' onclick='this.onmouseout = null; goDetails("+pois[i].ID+");return false;'>");
            resultsCode = resultsCode.concat(pois[i].NAME);
            resultsCode = resultsCode.concat("</a>");
            resultsCode = resultsCode.concat("</td>");
            resultsCode = resultsCode.concat("<td width='60px' align='right' valing='top'>");
            resultsCode = resultsCode.concat("<font class='resultDistance'>" +pois[i].DISTANCE + " KM</font>");            
            resultsCode = resultsCode.concat("</td>");
            resultsCode = resultsCode.concat("</tr>");
            resultsCode = resultsCode.concat(trCode);
            resultsCode = resultsCode.concat("<td colspan='2'>");
            resultsCode = resultsCode.concat("<font class='resultAddress'>" + pois[i].ADDRESS);
            if(pois[i].POSTAL_CODE != 'null') {
                resultsCode = resultsCode.concat("<br>" + pois[i].CITY+", "+pois[i].POSTAL_CODE + "</font>");
            } else {
                resultsCode = resultsCode.concat("<br>" + pois[i].CITY+"</font>");
            }
            resultsCode = resultsCode.concat("</td>");
            resultsCode = resultsCode.concat("</tr>");
        } else {
            resultsCode = resultsCode.concat(trCode);
            resultsCode = resultsCode.concat("<td>");
            resultsCode = resultsCode.concat("<a id='link"+pois[i].ID+"' class='resultsName' onmouseover='showInfo("+i+","+pois[i].X+","+pois[i].Y+")' onmouseout='hideInfo("+i+","+pois[i].X+","+pois[i].Y+")' href='#' onclick='this.onmouseout = null; goDetails("+pois[i].ID+");return false;'>");
            resultsCode = resultsCode.concat(pois[i].NAME);
            resultsCode = resultsCode.concat("</a>");
            resultsCode = resultsCode.concat("<br><font class='resultAddress'>" + pois[i].ADDRESS);
            if(pois[i].POSTAL_CODE != 'null') {
                resultsCode = resultsCode.concat("<br>" + pois[i].CITY+", "+pois[i].POSTAL_CODE + "</font>");
            } else {
                resultsCode = resultsCode.concat("<br>" + pois[i].CITY+"</font>");
            }
            resultsCode = resultsCode.concat("</td>");
            resultsCode = resultsCode.concat("</tr>");
        }
        
        if(blue) {
            blue = false;
        } else {
            blue = true;
        }
    }
    resultsCode = resultsCode.concat("</table>");
    return resultsCode;
}
function extractPOI(poi) {
    var resultsCode = "";
    resultsCode = resultsCode.concat("<table>");
    resultsCode = resultsCode.concat("<tr>");
    resultsCode = resultsCode.concat("<td>");
    if(poi.BANNER == 3) {
        resultsCode = resultsCode.concat("<img class=\"print\" src=\""+napaImage+"\">");
    } else if(poi.BANNER == 4) {
        resultsCode = resultsCode.concat("<img class=\"print\" src=\""+autoPartsImage+"\">");
    } else {
        resultsCode = resultsCode.concat("<img class=\"print\" src=\""+napaImage+"\">&nbsp;&nbsp;");
        resultsCode = resultsCode.concat("<img class=\"print\" src=\""+autoPartsImage+"\">");
    }
    resultsCode = resultsCode.concat("</td>");
    resultsCode = resultsCode.concat("</tr>");
    
    resultsCode = resultsCode.concat("<tr>");
    resultsCode = resultsCode.concat("<td class=\"detailTitle\">");
    resultsCode = resultsCode.concat(poi.NAME);
    resultsCode = resultsCode.concat("</td>");
    resultsCode = resultsCode.concat("</tr>");
    resultsCode = resultsCode.concat("<tr>");
    resultsCode = resultsCode.concat("<td class='detailText'>");
    resultsCode = resultsCode.concat(poi.ADDRESS);
    resultsCode = resultsCode.concat("</td>");
    resultsCode = resultsCode.concat("</tr>");
    resultsCode = resultsCode.concat("<tr>");
    resultsCode = resultsCode.concat("<td class='detailText' style='padding-bottom: 10px;'>");
    if(poi.POSTAL_CODE != 'null') {
        resultsCode = resultsCode.concat(poi.CITY + ", " + poi.PROVINCE + ", " + poi.POSTAL_CODE);
    } else {
        resultsCode = resultsCode.concat(poi.CITY + ", " + poi.PROVINCE);
    }
    resultsCode = resultsCode.concat("</td>");
    resultsCode = resultsCode.concat("</tr>");    
    resultsCode = resultsCode.concat("<tr>");
    resultsCode = resultsCode.concat("<td class='detailText'>");
    resultsCode = resultsCode.concat(telephone + " : " + poi.PHONE);
    resultsCode = resultsCode.concat("</td>");
    resultsCode = resultsCode.concat("</tr>");
    if(poi.TELEPHONE2 != "null" && poi.TELEPHONE2 != '') {
        resultsCode = resultsCode.concat("<tr>");
        resultsCode = resultsCode.concat("<td class='detailText'>");
        resultsCode = resultsCode.concat(telephone + " 2 : " + poi.TELEPHONE2);
        resultsCode = resultsCode.concat("</td>");
        resultsCode = resultsCode.concat("</tr>");
    }
    resultsCode = resultsCode.concat("<tr>");
    resultsCode = resultsCode.concat("<td class='detailText'>");
    resultsCode = resultsCode.concat(fax + " " + poi.FAX);
    resultsCode = resultsCode.concat("</td>");
    resultsCode = resultsCode.concat("</tr>");
    if(poi.CONTACTS.length > 0) {
        resultsCode = resultsCode.concat("<tr>");
        resultsCode = resultsCode.concat("<td class='detailText' style='padding-top: 10px; color: #447bad; font-weight: bold;'>");
        resultsCode = resultsCode.concat(resource);
        resultsCode = resultsCode.concat("</td>");
        resultsCode = resultsCode.concat("</tr>");
    }
    for( i = 0; i < poi.CONTACTS.length; i++ ) {
        resultsCode = resultsCode.concat("<tr>");
        resultsCode = resultsCode.concat("<td class='detailText'>");
        if(poi.TITLES[i] != '') {
            resultsCode = resultsCode.concat(poi.CONTACTS[i] + ", "+ poi.TITLES[i]);
        } else {
            resultsCode = resultsCode.concat(poi.CONTACTS[i]);
        }
        resultsCode = resultsCode.concat("</td>");
        resultsCode = resultsCode.concat("</tr>");
    }
    if(poi.EMAILADDRESS != "null" && poi.EMAILADDRESS != "") {
        resultsCode = resultsCode.concat("<tr>");
        resultsCode = resultsCode.concat("<td class='detailText'>");
        resultsCode = resultsCode.concat("<a class='detailText' href='mailto:"+poi.EMAILADDRESS+"'>"+poi.EMAILADDRESS+"</a>");
        resultsCode = resultsCode.concat("</td>");
        resultsCode = resultsCode.concat("</tr>");
    }
    if(poi.WEBSITE != "null" && poi.WEBSITE != "") {
        resultsCode = resultsCode.concat("<tr>");
        resultsCode = resultsCode.concat("<td class='detailText'>");
        if(poi.WEBSITE.indexOf('http://') != -1) {
            resultsCode = resultsCode.concat("<a class='detailText' href='"+poi.WEBSITE+"' target='_new'>"+poi.WEBSITE+"</a>");
        } else {
            resultsCode = resultsCode.concat("<a class='detailText' href='http://"+poi.WEBSITE+"' target='_new'>http://"+poi.WEBSITE+"</a>");
        }
        resultsCode = resultsCode.concat("</td>");
        resultsCode = resultsCode.concat("</tr>");
    }
    resultsCode = resultsCode.concat("</table>");
    return resultsCode;
}

function initBannerImages() {
    if(banner == '3') {
        poiImage = 'images/ICON_Napa_Small.gif';
        poiImageBig = 'images/ICON_Napa_Big.gif';
        imageXSmallOffset = -8;
        imageYSmallOffset = -8;
        imageXBigOffset = -11;
        imageYBigOffset = -11;
    } else {
        poiImage = 'images/ICON_CMAX_Small.gif';
        poiImageBig = 'images/ICON_CMAX_Big.gif';
        imageXSmallOffset = -18;
        imageYSmallOffset = -5; 
        imageXBigOffset = -25;
        imageYBigOffset = -7;
    }
}

