/*
 * $Id:$
 *
 * Power the maps page
 * created by FIXIA  2007 -  sales@fixia.com
 */

google.load("maps", "2.x");
google.load("search", "1");

var progress          = new ProgressMeter('progress');
var searcher          = null;
var map               = null;
var markersByCategory = {};

function load() {
    if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("map"));
        map.addControl(new GLargeMapControl());
        search = new google.search.LocalSearch();
        
        // create your mapvar map = new GMap2(document.getElementById("map_canvas"));
        // create a local search control and add it to your map
       // var lsc = new google.maps.LocalSearch(); 
       // map.addControl(new google.maps.LocalSearch());
        
	// create a local search control and add it to your map
	//var options = {
      //		suppressInitialResultSelection : true,
      	//	suppressZoomToBounds : true
      	//};
	//map.addControl(new google.maps.LocalSearch(options));
  
        
       // search.setCenterPoint(map);
        search.setNoHtmlGeneration();
        search.setResultSetSize(google.search.Search.LARGE_RESULTSET);
        initLoc(defaultLocation);
        GEvent.addListener(map, "dragend", function() { search.setCenterPoint(map); });
    }
}
google.setOnLoadCallback(load);

function initLoc(loc) { 
    search.setCenterPoint(loc);
    var geocoder = new GClientGeocoder();
    geocoder.getLatLng(loc, 
                       function(point) {
                           if(!point) {
                               $('message') = 'Sorry, ' + loc + ' is not a valid address. Try again';
                           } else {
                               $('center').value = loc;
                               //resetCategories();

                               var cats = checkedCategories();
                               resetCategories(cats);
                               map.setCenter(point,9);
                               displaySelectedMarkers(cats);


                              // map.setCenter(point, 10);
                              // displayAllMarkers();
                               var marker = new GMarker(point); 
        		       var blueIcon = new GIcon(G_DEFAULT_ICON);	
				// Set up our GMarkerOptions object
			       markerOptions = { icon:blueIcon };
                              map.addOverlay(new GMarker(point,markerOptions));
                              // map.setCenter(new GLatLng(37.4419, -122.1419), 13);
                               //displayAllMarkers();
                           }
                       });
}

function addToMap(category) {
    return function addToMap(result) {
        var point   = new GPoint(parseFloat(result.lng), parseFloat(result.lat));
        var latlng  = new GLatLng(parseFloat(result.lat), parseFloat(result.lng));
        var icon    = new GIcon();
        icon.image  = iconUrl(category.icon);
        icon.shadow = shadowUrl(category.icon);
        icon.iconSize = new GSize(34, 34);
        icon.shadowSize = new GSize(59, 32);
        icon.iconAnchor = new GPoint(13, 18);
        var marker = new GMarker(point, {icon: icon});
        map.addOverlay(marker);
        GEvent.addListener(marker, "click", function() {
                               map.openInfoWindowHtml(latlng, "<b>" + category.display + "</b><br />" +
                                                      "<a href='" + result.url + "'>" + result.title + "</a><br /> " +
                                                      result.streetAddress  + "<br />" +
                                                      ((result.phoneNumbers != undefined && result.phoneNumbers.length > 0) ?
                                                       result.phoneNumbers[0].number : ""));
                                                   
                           });
                           
        // var myDiv2 = document.getElementById("debug");
	//myDiv2.appendChild( document.createTextNode(result.title + " address:" +  result.streetAddress) );
	//myDiv2.appendChild( document.createElement("BR") );
//var str="Visit Microsoft!";
//document.write(str.replace(/Microsoft/,"W3Schools"));


	d = document.getElementById("debug");
	var str = result.title;
	var addStr = result.streetAddress;
	
	if (addStr.length > 0 ) {
		addStr = " &nbsp;&nbsp;<b>address:</b>" + addStr;
	} else {
		addStr = "";
	};
	
	d.innerHTML = d.innerHTML + "<BR><b>Name:</b>" + str.replace("<b>","").replace("</b>","") +   addStr;


        if(markersByCategory[category.name] == undefined) {
            markersByCategory[category.name] = [];
        }
        marker.toString = function() { return result.title + "/" + result.streetAddress; };
        markersByCategory[category.name].push(marker);
    }
} 
    

function displayMarkers(category, show, checkbox, success) {
//if ( DEBUGMAP == "TRUE"){
var element = document.getElementById("debug");
while (element.firstChild) {
  element.removeChild(element.firstChild);
}

//};
    if(show && markersByCategory[category] == undefined) {
        progress.show();
        checkbox.disabled = true;
       checkbox.checked = true;
        var handler = { onload: function() {
                            search.results.each(addToMap(category));
                            progress.hide();
                            checkbox.disabled = false;
                            if(success) {
                                success();
                            }
                        } 
                      };
        search.setSearchCompleteCallback(handler, handler.onload);
        search.execute(category.search);
    } else if(show) {
        markersByCategory[category.name].each(function(x) { x.show(); });
    } else if(!show && markersByCategory[category.name] != undefined) {
        markersByCategory[category.name].each(function(x) { x.hide(); });
    }
}

function displayAllMarkers() {
    function doit(categories) {
        if(categories.length == 0) {
            return
        }
        var c = categories.shift();
        displayMarkers(c, true, $('cat_'  + c.name), 
                       function() { doit(categories); });
    }
    doit(categories.clone());
}

function refreshAll() {
    resetCategories();
    displayAllMarkers();
}


function displaySelectedMarkers(cats) {
    function doit(categories) {
        if(categories.length == 0) {
            return
        }
        var c = categories.shift();
        displayMarkers(c, true, $('cat_'  + c.name), 
                       function() { doit(categories); });
    }
    doit(cats.clone());
}

function checkedCategories() {
    return categories.findAll(function(c) { return $('cat_' + c.name).checked });
}
function refresh() {
    var cats = checkedCategories();
    resetCategories(cats);
    displaySelectedMarkers(cats);
}


function nameToMapType(name) {
    if(name == 'map') {
        return G_NORMAL_MAP;
    } else if(name == 'satellite') {
        return G_SATELLITE_MAP;
    } else if(name == 'hybrid') {
        return G_HYBRID_MAP;
    }
}
    
function iconUrl(name) {
    return "http://www.google.com/intl/en_us/mapfiles/ms/micons/" + name  + ".png";
}

function shadowUrl(name) {
    return "http://www.google.com/intl/en_us/mapfiles/ms/micons/" + name + ".shadow.png";
}

function resetCategories(cats) {
    cats.each(function(c) {
                  $('cat_' + c.name).checked = false;
                  if(markersByCategory[c.name] != undefined) {
                      markersByCategory[c.name].each(function(m) { m.hide(); });
                      markersByCategory[c.name] = undefined;
                  }
              });
}
    
